Mysql索引学习笔记
Posted lsl547445
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Mysql索引学习笔记相关的知识,希望对你有一定的参考价值。
存储引擎
1、mysql主要有innodb和myIsam存储引擎,存储引擎是针对于数据库表层面的
2、索引方法:B+ tree和hash两种:
B+Tree索引方法
在使用innodb存储引擎是B+ Tree主键索引采用的是聚簇索引:即索引跟数据存放在同一位置,找到索引即找到数据。其他索引采用的不是聚簇索引,而是存放的主键索引的地址
所以innodb存储引擎下一般会定义一个整形的自增主键。
下面引申出两个问题:
1、inno db建表一般常见主键有两种:一个是整形自增主键,一个是uuid随机主键,那么该使用哪个主键好,为什么?
答:根据索引数据结构,主键建议使用整形自增主键,理由如下:
1、数据插入是需要对索引进行一个维护操作,整形自增主键比uuid维护成本较低
2、进行查询操作时,需要对索引进行一个对比查找,自增主键查找速度比uuid快
hash索引
hash索引是用散列存储,优点是等值查找速度很快,缺点是范围查找速度很慢,范围查找和索引查找无异;
回表
回表是指可以通过索引先查询出id字段,再通过主键id字段,查询行中的字段数据的过程,即通过再次查询提供MySQL查询速度。
引出问题:
1、所有非聚簇索引都会进行回表操作么?
答:不是,如果查询字段只有非聚簇索引字段本身的话不会触发回表操作。
2、如何能够减少回表操作?
答:可以通过组合索引减少回表操作。
什么情况下索引会失效
1、使用!=或<>
2、类型不一致:如果列类型是字符串,where条件中没有使用引号的情况下。
3、使用函数
4、运算符导致索引失效
5、组合索引没有遵循最左原则
6、like是以%开头
7、如果数据量不大,mysql估计使用全表扫描比使用索引快
8、在where子句中进行null值判断的话会导致引擎放弃索引而产生全表扫描
9、where子句中使用or来连接条件,因为如果俩个字段中有一个没有索引的话,引擎会放弃索引而产生全表扫描
以上是关于Mysql索引学习笔记的主要内容,如果未能解决你的问题,请参考以下文章