1、创建复合索引的时候不要跨列使用(where和order by 拼起来会产生跨列效果)
create table test(
a1 varchar(20),
a2 varchar(20),
a3 varchar(20),
a4 varchar(20)
)
alter table test add index index_a1_a2_a3_a4(a1,a2,a3,a4)
推荐写法:
select a1,a2,a3,a4 from test where a1=1 and a2=2 and a3=3 and a4=4;
总结:如果(a,b,c,d)复合索引和使用的顺序一致(且不跨列使用),则复合索引全部使用,如果部分一致,则部分使用
2、单表
1、添加索引
2、根据sql实际解析的顺序,调整索引的顺序
3、如果存在in 可能会使索引失效,可以将in的字段放在后面
解析顺序:
from on join where group by having select distinct order by
如果改变索引需要将之间创建的索引删除
drop index 索引名 on 表名
总结:最佳做前缀,保持索引的定义和使用的顺序一致性;索引需要做逐步优化;
将in的范围查询 做到where条件的最后 防止失效
3、双表
left join
1、加索引
原则:小表驱动大表
给左表加索引
4、三张表优化
1、小表驱动大表
2、索引建立在需要查询的字段上