③ id有相同 也有不同 同时存在 id相同的可以认为是一组,从上往下执行,在所有的组中,id的值越大,优先级越高,越先执行
复制代码
分析执行计划-Explain之select_type
simple:没有子查询和union
primary:主查询,也就是子查询中的最外层查询
subquery:在select 和where中包含子查询
derived:在from包含子查询,被标记为临时表
union:存在union语句
复制代码
分析执行计划-Explain之type
type含义NULLMySQL不访问任何表,索引,直接返回结果system系统表,少量数据,往往不需要进行磁盘IO,如果是5.7及以上版本的话就不是system了而是all,即使只有一条记录const命中主键或者唯一索引,被链接的部分是一个常量值eq_ref对于前表的每一行,后表只有一行被扫描.①join查询,②命中主键或者非空唯一索引③等值连接ref非唯一索引扫描,返回匹配某个单独值的所有行,对于前表的每一行,后表可能有多余一行的数据被扫描range只检索给定返回的行,使用一个索引来选择行,where 之后出现between,,in等操作index需要扫描索引上的全部数据all全表扫描,此时id上无索引结果值从好到坏依次是:system > const > eq_ref > ref > range > index > all
eg: select name from t_user where name like '%你%' -- 会使用索引
-- 如果mysql评估使用索引比全表更慢,这不使用索引,这种是由数据本身决定的,
eg:user表的address字段有索引,100条数据其中99条address字段的值都是北京
则select * from user where address='北京'; 索引失效.
-- is null,is not null 有时有效,有时索引失效
select * from user where address is null; -- 走索引,因为数据中为空的数据少,所以走索引,反之当address为空的数据多时候,就不走索引了. is not null 同理相反而已
-- in 搜索引 not in 索引失效
-- 如果一张表有多个单列索引,即使where中都使用了这些索引列,则只有一个最优索引生效.
复制代码
① 大批量插入数据,保证主键的顺序性,会提高插入效率
② 理论上连接查询要比子查询的效率高,一些子查询还要在内存中创建临时表.
真诚地邀请您加入我们的大家庭,在这里不仅有技术知识分享,还有博主们之间的互帮互助.还不定期发红包,每月更有抽奖环节,游戏机和实体书相赠(包邮),让我们抱团取暖,抱团内卷.打造美好C站.期待您的加入.