(1)复合索引
a. 复合索引,不要跨列或无序使用(最佳左前缀)
(a, b , c )
b. 复合索引,尽量使用全索引匹配
(a, b, c)
(2)不要在索引上进行任何操作(计算、函数、类型转换),否则索引失效。
select … where A.x = … --假设x为索引,不要(2*A.X),导致索引失效。
(3)复合索引不能使用不等于(!= 或 < 或 >)或is null (is not null),否则自身以及右侧所有全部失效。
select … from… where A.x != 2
体验概率情况(< > in): 原因是服务层中有SQL优化器,可能会影响我们的优化。
drop index idx_typeid on book;
复合索引如果有>,<,=, 则右侧索引可能全失效(概率)
我们学习索引优化,是一个大部分情况适用的结论,但由于SQL优化器等原因 该结论不是100%正确。
(4)补救。尽量使用索引覆盖(using index)
select a, b from …where a=… and b=…
(5)like 尽量以“常量”开头,不要以‘%’开头,否则索引失效
select … from …where a like ‘%_a%’
如果一定要使用,可以改为索引覆盖
(6)尽量不要使用类型转换(显示,隐式),否则索引失效
select * from teacher where tname = 123; //程序底层将123->‘123’,即进行了类型转换
(7)尽量不要使用or, 否则索引失效
select * from teacher where tname=‘’ or tcid > 1;