1、建索引时,要建立区分度高的索引。区分度高的索引,可以快速得定位数据,区分度太低,无法有效的利用索引,可能需要扫描大量数据页,和不使用索引没什么差别。如果是组合索引,也尽量以区分度更高的排在前面。
2、联合索引注意最左匹配原则:按照从左到右的顺序匹配,MySQL会一直向右匹配索引直到遇到范围查询(>、<、between、like)然后停止匹配。
3、可能的话尽量只利用索引覆盖,可以减少回表操作,提升效率。
4、避免索引失效的原则:禁止对索引字段使用函数、运算符操作,会使索引失效。
5、避免非必要的类型转换,字符串字段使用数值进行比较的时候会导致索引无效。
6、模糊查询'%value%'会使索引无效,变为全表扫描,因为无法判断扫描的区间,但是'value%'是可以有效利用索引。
7、索引覆盖排序字段,这样可以减少排序步骤,提升查询效率
8、尽量的扩展索引,非必要不新建索引。比如表中已经有a的索引,现在要加(a,b)的索引,那么只需要修改原来的索引即可。
适合的场景
1、主键自动建立唯一索引
2、频繁作为查询条件的字段应该创建索引
3、查询中与其他表关联的字段,外键关系创建索引
4、频繁更新的字段不适合创建索引
5、where条件里用不到的字段不创建索引
6、在高并发下倾向创建组合索引
7、查询中排序的字段,排序字段若通过索引去访问将大大提高排序速度
8、查询中统计或者分组字段
不适合的场景
1、表记录太少[mysql 300W以内够用]
2、经常增删改的表
3、数据重复且分布平均的表字段,因此应该只为经常查询和排序的数据列建立索引。如果某个数据列包含许多重复内容,为它建立索引没有太大的实际意义。
1、全值匹配没有遵循最佳左前缀法则
2、最佳左前缀法则--如果索引了多列,要遵循最左前缀法则。指的是查询从索引的最左前列开始并且不跳过索引中的列。
3、不要在索引列上做任何操作(计算、函数、类型转换),做操作会导致索引失效而转向全表扫描
4、存储引擎不能使用索引中范围条件右边的列[范围条件放到最后 > < ]
5、尽量使用覆盖索引(只访问索引查询、索引列和查询列一致),减少select *
6、mysql在使用不等于的时候无法使用索引会导致全表扫描
7、is null,is not null 无法使用索引
8、like以通配符开头,mysql索引失效会变成全表扫描 [建覆盖索引,可以在%开头的情况下,索引不失效]
9、字符串不加单引号索引号失效
10、少用or,用or连接会让索引失效
本文作者:whitebear
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!