【金三银四】深刻理解MySql索引底层数据结构解密 juejin.im/post/5e0d7b…mysql
【金三银四】MySql执行计划EXPLAIN详解 juejin.im/post/5e12e4…sql
【金三银四】MySql执行计划EXPLAIN最佳实践 juejin.im/post/5e12e4…bash
【金三银四】MySql索引优化实战 juejin.im/post/5e12e5…数据结构
EXPLAIN SELECT * FROM employees WHERE name= 'LiLei';
复制代码
EXPLAIN SELECT * FROM employees WHERE name= 'LiLei' AND age = 22;
复制代码
EXPLAIN SELECT * FROM employees WHERE name= 'LiLei' AND age = 22 AND position ='manager';
复制代码
若是索引了多列,要遵照最左前缀法则。指的是查询从索引的最左前列开始而且不跳过索引中的列。函数
EXPLAIN SELECT * FROM employees WHERE age = 22 AND position ='manager';
复制代码
EXPLAIN SELECT * FROM employees WHERE position = 'manager';
复制代码
EXPLAIN SELECT * FROM employees WHERE name = 'LiLei';
复制代码
EXPLAIN SELECT * FROM employees WHERE name = 'LiLei';
复制代码
EXPLAIN SELECT * FROM employees WHERE left(name,3) = 'LiLei';
复制代码
EXPLAIN SELECT * FROM employees WHERE name= 'LiLei' AND age = 22 AND position ='manager';
复制代码
EXPLAIN SELECT * FROM employees WHERE name= 'LiLei' AND age > 22 AND position ='manager';
复制代码
EXPLAIN SELECT name,age FROM employees WHERE name= 'LiLei' AND age = 23 AND position ='manager';
复制代码
EXPLAIN SELECT * FROM employees WHERE name= 'LiLei' AND age = 23 AND position ='manager';
复制代码
EXPLAIN SELECT * FROM employees WHERE name != 'LiLei';
复制代码
EXPLAIN SELECT * FROM employees WHERE name is null;
复制代码
EXPLAIN SELECT * FROM employees WHERE name like '%Lei';
复制代码
EXPLAIN SELECT * FROM employees WHERE name like 'Lei%';
复制代码
问题:解决like'%字符串%'索引不被使用的方法?post
a)使用覆盖索引,查询字段必须是创建覆盖索引字段mysql索引
EXPLAIN SELECT name,age,position FROM employees WHERE name like '%Lei%';
复制代码
b)当覆盖索引指向的字段是varchar(380)及380以上的字段时,覆盖索引会失效!优化
EXPLAIN SELECT * FROM employees WHERE name = '1000';
复制代码
EXPLAIN SELECT * FROM employees WHERE name = 1000;
复制代码
EXPLAIN SELECT * FROM employees WHERE name = 'LiLei' or name = 'HanMeimei';
复制代码
原则:小表驱动大表,即小的数据集驱动大的数据集ui
in:当B表的数据集必须小于A表的数据集时,in优于existsspa
select * from A where id in (select id from B)
explain select * from film where id in(select film_id from film_actor);
复制代码
explain select * from film where exists (select 1 from film_actor where film_actor.film_id = film.id)
复制代码
一、EXISTS (subquery)只返回TRUE或FALSE,所以子查询中的SELECT * 也能够是SELECT 1或select X,官方说法是实际执行时会忽略SELECT清单,所以没有区别
二、EXISTS子查询的实际执行过程可能通过了优化而不是咱们理解上的逐条对比
三、EXISTS子查询每每也能够用JOIN来代替,何种最优须要具体问题具体分析
like KK%至关于=常量,%KK和%KK% 至关于范围