ONE.一条sql的执行顺序
其实每一个语句都会产生一个虚拟的表,只是看不到而已。
可以想象成去买菜,不断从一个大篮子里,按照sql的要求找出符合条件的菜,最终满足所有来返回给自己。
所以越早挑选出符合较少的那个条件的菜,可以让接下来的筛选更加快捷。
- FORM
- ON
- JOIN
- WHERE
- GROUP BY
- CUBE | ROLLUP
- HAVING 【所以having可以对已经分组的进行筛选】
- SELECT
- DISTINCT
- ORDER BY
- LIMIT
TWO EXPLAIN命令 ——查看优化器如何决定执行查询
我们可以通过EXPLAIN 命令一条Sql具体是怎么去优化执行
关于不同引擎
INNODB
行级锁
MyISIAM
表锁
因为在MyISIAM里 写的优先级很高,高于读,只要读没有锁表,写就会强行插入。在读之前。如果这时候大量插入写,会导致读的查询饿死。
在大量的数据前提下,但是只读的话 效率比InnoDB高
索引覆盖
索引覆盖是指建索引的字段正好是覆盖查询条件中所涉及的字段,这里需要注意的是,必须是从第一个开始覆盖
ex:
- select a,b,c from t where a=1 ;
建的索引为
ALTER TABLE t ADD KEYidx_a
(a
) USING BTREE COMMENT 'test';
2.select a,b,c from t where a=1 and b=2;
建的索引为
ALTER TABLE t ADD KEYidx_a_b_c
(a,b,c
) USING BTREE COMMENT 'test';
没有索引覆盖的例子
1.select a,b,c from t where c=1 and a=1 and b=2;
建的索引为
ALTER TABLE t ADD KEYidx_a_b
(a,b
) USING BTREE COMMENT 'test';
2.select * from t where a=1 and b=2;
这个是因为没有索引覆盖所有的列。所以不能被覆盖
3.1.select a,b,c from t where a=1 and c=1 and b=2;
建的索引为
ALTER TABLE t ADD KEYidx_a_b
(a,b
) USING BTREE COMMENT 'test';
无法使用索引覆盖的时候,我们可以实现一个基于索引覆盖的延迟关联
select * from t on (select a from t where c=1,b=2) as t2 on t1.a=t.a;
这样extra也会有一个被覆盖的。

网友评论