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 的数据列只用从索引中就能够取得,不必读取数据行,换句话说查询列要被所建的索引覆盖。
    image.png
    explain select * from emp where name like ‘%abc’;
    image.png

    image.png
    使用覆盖索引后
    image.png