Mysql 之 ❤ 关于优化

2018-01-19  本文已影响0人  miyakee

ONE.一条sql的执行顺序

其实每一个语句都会产生一个虚拟的表,只是看不到而已。
可以想象成去买菜,不断从一个大篮子里,按照sql的要求找出符合条件的菜,最终满足所有来返回给自己。
所以越早挑选出符合较少的那个条件的菜,可以让接下来的筛选更加快捷。

  1. FORM
  2. ON
  3. JOIN
  4. WHERE
  5. GROUP BY
  6. CUBE | ROLLUP
  7. HAVING 【所以having可以对已经分组的进行筛选】
  8. SELECT
  9. DISTINCT
  10. ORDER BY
  11. LIMIT

TWO EXPLAIN命令 ——查看优化器如何决定执行查询

我们可以通过EXPLAIN 命令一条Sql具体是怎么去优化执行

关于不同引擎

INNODB

行级锁

MyISIAM

表锁
因为在MyISIAM里 写的优先级很高,高于读,只要读没有锁表,写就会强行插入。在读之前。如果这时候大量插入写,会导致读的查询饿死。
在大量的数据前提下,但是只读的话 效率比InnoDB高

索引覆盖

索引覆盖是指建索引的字段正好是覆盖查询条件中所涉及的字段,这里需要注意的是,必须是从第一个开始覆盖
ex:

  1. select a,b,c from t where a=1 ;
    建的索引为
    ALTER TABLE t ADD KEY idx_a (a) USING BTREE COMMENT 'test';
    2.select a,b,c from t where a=1 and b=2;
    建的索引为
    ALTER TABLE t ADD KEY idx_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 KEY idx_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 KEY idx_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也会有一个被覆盖的。


extra字段
上一篇下一篇

猜你喜欢

热点阅读