面试时候遇到的一些相关问题:
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';