表结构
索引: create index idx_ename_job_mgr on emp(ename,job,mgr)
索引长度: ename = 33 job=30 mgr=5 总长:68
一.全值匹配
explain select * from emp where ename=‘张三’ and job=‘推销员’ and mgr=7698;
使用全部索引总长68
最佳左前缀
**带头大哥不能死,中间兄弟不能断,符合条件可交换.**
带头大哥GG不使用索引
explain select * from emp where job=‘推销员’ ;
带头大哥GG,全表扫描
explain select * from emp where mgr=7698;
带头大哥GG,全表扫描
explain select * from emp where job=‘推销员’ and mgr=7698 ;
带头大哥GG,全表扫描
explain select * from emp where mgr=7698 and job=‘推销员’;
带头大哥GG,全表扫描
有头,断兄弟,使用部分索引
explain select * from emp where ename=‘张三’ and mgr=7698;
使用部分索引ename字段,总长为33
explain select * from emp where mgr=7698 and ename=‘张三’;
使用部分索引ename字段,总长为33
符合条件位置可交换(有带头且不断中间兄弟)
explain select * from emp where ename=‘张三’ and job=‘推销员’;
使用部分索引ename、job字段,总长63
explain select * from emp where job=‘推销员’ and ename=‘张三’ ;
使用部分索引ename、job字段,总长63
explain select * from emp where ename=‘张三’ and job=‘推销员’ and mgr=7698;
使用全部索引ename、job、mgr字段,总长68
explain select * from emp where job=‘推销员’ and mgr=7698 and ename=‘张三’ ;
使用全部索引ename、job、mgr字段,总长68
explain select * from emp where mgr=7698 and ename=‘张三’ and job=‘推销员’ ;
使用全部索引ename、job、mgr字段,总长68
二.不在索引列计算操作
三.尽量使用覆盖索引,少使用select *
四.mysql中使用is null、is not null、or、!=、>、<时可能会导致索引失效
五.like以%开头可能会导致索引失效eg:(’%abc’)
解决索引失效---------->使用覆盖索引
where,或者group by条件中出现了索引列的计算也能通过覆盖索引解决,但是group by可能会导致Extra中Using temporary,Using filesort(group by计算索引列等价于重排序).因此在rows少的情况下无大碍.