联合索引(A,B,C)
- where A=x AND C=X 这种情况不走索引。
- 2.当我们直接使用B或者C的时候不走索引原因很简单,在A不相同的时候B和C是无序的 所以无法按照规律查找。
模糊匹配(like)
- 1.一般字符串比较大小都是逐个字符按照字符集和比较规则进行比较
- 2.所以对于LIKE 'As%'是可以走索引的,因为通过As可以比较索引列。
- 3.%As% 和%com 这种只能走全表扫描
匹配范围值
- 1.使用联合索引查询,如果对多个列同时进行范围查找的话,只有对索引最左边的那个列进行范围查找的时候才能用到B+树索引。
- 2.至于1中为啥其他列用不上索引是因为,最左列采用的是范围索引,其他列只有在最左列相等的情况下才是排序的。
- 3.因此当联合索引的时候如果最左列是精确匹配(即=),则第二列可以范围匹配,但是第三列则无法范围匹配。
- 4.对于前面走索引可以得到集合,通过逐步遍历匹配后面的查询条件。
排序
- 1.把这种在内存中或者磁盘上进行排序的方式统称为文件排序(英文名:filesort)
- 2.ORDER BY子句里使用到了我们的索引列,就不需要文件排序。
- 3.对于联合索引,ORDER BY的子句后边的列的顺序也必须按照索引列的顺序给出 才能走索引。
不可以使用索引进行排序的几种情况
- 1.ASC(默认规则)、DESC混用的情况下不会排序
- 2.WHERE子句中出现非排序使用到的索引列--即where的规则不走索引,因此就算Order by里面包含索引列也不走索引。
- 3.排序列包含非同一个索引的列
- 4.排序列使用了复杂的表达式
分组
- 1.分组的要走索引的话 其要求和排序相同。
回表的代价
- 1.当我们查询数据多余二级索引的列,那么必要要回表
- 2.而若是走二级索引查询是顺序IO--因为只需要查找顺序进行检索
- 3.当需要回表时候,每在二级索引查询到一条记录都要去主键索引查询一次这个过程是随机的,因为数据不是存放在一个数据页上。
- 4.一般情况下,限制查询(limit)获取较少的记录数会让优化器更倾向于选择使用二级索引 + 回表的方式进行查询,反之则是全表查询。
覆盖索引
- 1.如果我们查询的数据直接出现在索引的叶子节点,则不需要回到主键索引--这就是覆盖索引。
如何挑选索引
- 1.只为用于搜索、排序或分组的列创建索引
- 2.列的基数指的是某一列中不重复数据的个数,在记录行数一定的情况下,列的基数越大,该列中的值越分散,列的基数越小,该列中的值越集中
- 3.列的基数越大 建立索引越有必要。
- 4.索引列的类型尽量小,即不要太长-列越小在查询时进行的比较操作越快,索引占用的存储空间就越少,在一个数据页内就可以放下更多的记录,从而减少磁盘I/O带来的性能损耗
- 5.索引字符串值的前缀--即针对字符串很长的列,可以指定前缀作为索引。
- 6.索引列前缀会让排序采用文件排序(因为无法走索引了)
- 7.如果插入的索引列忽大忽小,会造成页分裂。进而影响性能
网友评论