EXPLAIN SELECT * FROM class LEFT JOIN book on book.card=class.card ;
#book使用了索引,left join 左边为驱动表,右边为被驱动表 , 第一个被扫描的为驱动表,后面为被驱动表,驱动表全表扫描避免不了,建议表中数据较少的作为驱动表(表中数据较少的放在左边)
right left : 相反左边是被驱动表,右边是驱动表
show index FROM
#添加索引
ALTER TABLE book ADD index Y (card);
ALTER TABLE class ADD index X (card);
DROP INDEX Y ON book ;
EXPLAIN SELECT * FROM class INNER JOIN book on book.card=class.card ; #INNER JOIN 会自动选择谁做驱动表和被驱动表,他会选择有索引的作为被驱动表
当连接查询有where条件时,带where条件的表是驱动表,否则是被驱动表
create index idx_age_deptid_name on emp (age,deptid,name)
以下 是否能使用到索引,能否去掉using filesort
1、explain select SQL_NO_CACHE from emp order by age,deptid; #没有使用到索引
2、 explain select SQL_NO_CACHE from emp order by age,deptid limit 10;#使用了索引
#无过滤 不索引
create index idx_age_deptid_name on emp (age,deptid,name)
3、explain select from emp where age=45 order by deptid; #使用了索引
4、explain select from emp where age=45 order by deptid,name; #使用了索引
5、explain select from emp where age=45 order by deptid,empno;#没有使用索引,empno没有添加索引
6、explain select from emp where age=45 order by name,deptid; #name在前面不能使用索引
7、 explain select from emp where deptid=45 order by age; #也无法使用
*#顺序错,必排序
8、 explain select from emp where age=45 order by deptid desc, name desc ; #使用了索引
9、 explain select from emp where age=45 order by deptid asc, name desc ;#没有使用索引
#方向反 必排序
explain select * from emp where age = 30 and empno<101000 order by name ;
create index idx_age_empno on emp(age,empno) ; #使用这个
create index idx_age_name on emp(age,name);
Mysql会自动选择最优的索引
什么是覆盖索引?
简单说就是,select 到 from 之间查询的列 <=使用的索引列+主键
覆盖索引是 select 的数据列只用从索引中就能够取得,不必读取数据行,换句话说查询列要被所建的索引覆盖。

explain select * from emp where name like ‘%abc’;


使用覆盖索引后
