索引的优化方式

某本书中说到索引的设计是否优秀可以分为三个星级

  • 一星索引:索引将相关记录放到一起
  • 二星索引:索引的数据顺序和查找中的顺序一致
  • 三星索引:索引列包含查询中需要的全部列

复合索引设计技巧

  1. 我们都知道复合索引是遵循最左前缀法则的,这种规则使我们设计复合索引的顺序时都考虑使用频率最高的字段放在最左边以此类推,这种思路是没问题的,但是比如一个场景:设计一个约会网站系统搜索条件为国家,姓名,性别,它们都支持单一条件查询,这种场景不管你怎么设计复合索引都有可能用不到,但是有一种诀窍可以最大几率的用到索引,首先这样设计 key(性别,国家,姓名),当性别用不到时SQL语句添加一行AND sex IN(‘m’,‘f’),这样的话怎用到索引的几率就大大提升了,不过如果列有太多不同的值,就会让in的列表太长,这样做就不行了。
  2. 范围查询会让范围列后面的索引失效,所以设计顺序时需要把范围查询的字段放到最右边,让优化器尽可能多的用到索引列。

前缀索引的计算保存最优长度的方式

有时候需要索引很长的字符列(比如订单流水号之类的),这会让索引变得大且慢,通常可以用只保存字符串前缀的方式,减少索引的空间,但是这样做也是有代价的,如果保存的前缀重复性太高也就是可选择性太低的话,那么索引所需要过滤的行数也越多,相对地查询速度也就慢了。

比如下面这个表, 总共有6条重复的,前面7位数相等

SELECT count(DISTINCT left( `password`,1) )/count(*) FROM `ums_member`

通过这个算法截取前面1位进行计算的话得出来的选择性是

截取第8位计算,选择性就提高了,但是同时需要保存的长度也越长了,通常来说选择性越高需要保存的长度也越长,所以做前缀索引之前还是要充分考虑下之间的取舍了

建立前缀索引的命令

ALTER TABLE ums_member ADD KEY(password(8))
posted @ 2022-06-09 20:21  猫长寿  阅读(135)  评论(0编辑  收藏  举报