美文网首页
Mysql 之 ❤ 关于优化

Mysql 之 ❤ 关于优化

作者: miyakee | 来源:发表于2018-01-19 16:35 被阅读0次

    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字段

    相关文章

      网友评论

          本文标题:Mysql 之 ❤ 关于优化

          本文链接:https://www.haomeiwen.com/subject/mgyuoxtx.html