MySQL索引:索引的分类和索引匹配

面试时候遇到的一些相关问题:

Q1:发现一些SQL语句比较慢,怎么去创建索引?

Q2:在写SQL语句时,有哪些点会造成索引失效?

 索引分类:

1.主键索引当给表创建了主键时,其他数据会按照主键来组织,这就是主键索引

2.唯一索引(unique)给一列设置了值是唯一的,不允许有重复值出现

3.普通索引(又叫二级索引或者普通索引)除了主键和唯一键创建的索引

4.全文索引类似检索,5.6后InnoDB支持,貌似很少用

5.组合索引

InnoDB中使用了自适应哈希索引,Memory引擎使用的是哈希索引

哈希索引:

基于哈希表实现的,只有精确匹配索引所有列的查询才有效

哈希索引自身只需要存储对应的hash值,所以索引的结构非常紧凑,这让哈希索引的查找的速度非常快

哈希索引的限制:

  • 哈希索引质保函哈希值和指针,而没有存储值字段,所以不能用索引中的值来避免读取数据行

  • 哈希索引数据并不是按照索引值顺序存储的,所以无法进行排序

  • 哈希索引不支持部分列查找,因为hash值是通过全部索引列来计算的

  • 哈希索引支持等值查询,不支持范围查询

  • 访问哈希索引很快,除非有哈希冲突,当有冲突时,索引引擎必须遍历表中所有航指针,逐行进行比较,知道查到符合条件的值

  • 哈希冲突太多的话,维护代价也很大

索引匹配方式

staff表,有两个索引,一个是id主键索引,另一个是组合索引(name,age,pos)

1.全值匹配

和索引中所有的列进行匹配

explain select * from staffs where name='July' and age=23 and pos='dev';

2.匹配最左前缀

只匹配前面的几列

explain select * from staffs where name='July' and age=23;
explain select * from staffs where name='July';

3.匹配列前缀

可以匹配某一列的值的开头部分

explain select * from staffs where name like 'J%'; //会用到索引
explain select * from staffs where name like '%y'; //不会用到索引,索引失效,根本不知道的%是啥

/*如果使用索引时,出现了范围条件(>,<,>=,<=)时,后面的索引不会用到,是索引失效的一种情况,如下*/
explain select * from staffs where name='Jack' and age>20 and pos=10; //pos列索引不会被使用

4.匹配范围值

可以查找某一个范围的数据

explain select * from staffs where name>'Mary';

5.精确匹配某一列并范围匹配另一列

explain select * from staffs where name='July' and age>23;

6.只访问索引的查询

查询的时候只需要访问索引,不需要访问数据行,本质上就是覆盖索引

explain select name,age,pos from staffs where name='July' and age=23 and pos='dev';

 

 

 

 

 

上一篇:mysql索引


下一篇:MySQL的explain字段解释