MySQL优化学习日记8——避免索引失效的一些原则

目录

1、不要跨列或无序使用(最佳左前缀)

2、不要在复合索引上进行任何操作(计算、函数、类型转换),进行操作的属性的索引 和 他后面的属性的索引会失效

3、独立索引使用 != < > 或者 is null 等,进行操作的属性的索引会失效 和 他后面的属性的索引可能会失效

4、like 尽量以 “常量” 开头,不要以 “%” 开头,否则索引失效

5、尽量不要使用类型转换(显示、隐式),否则索引失效

6、尽量不要使用 or,否则索引失效


1、不要跨列或无序使用(最佳左前缀)

建议:尽量使用全索引匹配(索引覆盖):一个查询语句的执行只用从索引中就能够取得,不必从数据表中读取。

2、不要在复合索引上进行任何操作(计算、函数、类型转换),进行操作的属性的索引 和 他后面的属性的索引会失效

下图中 authorid 和 typeid 属性在 book 表的多列索引 idx_atb 中

MySQL优化学习日记8——避免索引失效的一些原则_第1张图片

3、独立索引使用 != < > 或者 is null 等,进行操作的属性的索引会失效 和 他后面的属性的索引可能会失效

注意:MySQL 本身有 sql 优化器,实际优化效果并非百分之百达到预期

MySQL优化学习日记8——避免索引失效的一些原则_第2张图片

4、like 尽量以 “常量” 开头,不要以 “%” 开头,否则索引失效

select * from xx where name like ’%x%‘; —— name索引失效

MySQL优化学习日记8——避免索引失效的一些原则_第3张图片

 如果必须使用 like '%d%'进行模糊查询,可以使用索引覆盖挽救一部分。

5、尽量不要使用类型转换(显示、隐式),否则索引失效

explain select * from teacher where tname = 'abc';

# 程序底层将 123 -> '123',即进行了类型转换,因此索引失效了
explain select * from teacher where tname = 123;

MySQL优化学习日记8——避免索引失效的一些原则_第4张图片

6、尽量不要使用 or,否则索引失效

# 将or左侧的tname失效
explain select * from teacher where tname = '' or tcid>1;

你可能感兴趣的:(MySQL学习日记,sql,linq,数据库)