美文网首页
坚持打卡学习第八天——mysql中文文档学习四

坚持打卡学习第八天——mysql中文文档学习四

作者: 去追星星 | 来源:发表于2021-12-23 22:18 被阅读0次

    暂时只想知道我应该如何去优化不想知道mysql是怎么优化的,有的解释是真的不好懂,这玩意看的人枯燥死了。。。。。。

    1、优化where子句

    (1)去除不必要的括号
    ((a AND b) AND c OR (((a AND b) AND (c AND d))))
    结果:(a AND b AND c) OR (a AND b AND c AND d)
    (2)常量叠加
    (a<b AND b=c) AND a=5
    结果: b>5 AND b=c AND a=5

    2、优化范围

    单元素索引范围条件定义:
    (1)对于B-树和Hash索引,使用=,<=>,in,is null,is not null操作符时,关键元素与常量值的比较关系对应一个范围条件
    (2)对于B-树索引,当使用>,<,>=,<=,between,!=,<>,或者like 'pattern'(不以通配符开始)操作是,关键元素与常量值的比较关系对应一个范围条件
    (3)对于所有索引,多范围条件结合OR或AND则产生一个范围条件
    where字句中有范围条件的查询例子:

    select * from t1 where key1 > 1 and key2 < 10;
    select * from t1 where key1 = 1 or key2 in (14,23,34);
    select * from t1 where key1 like 'ad%' or key2 between
    'bar' and 'foo';
    

    3、部分非常量值转化为常量

    SELECT * FROM t1 WHERE 
    (key1 < 'abc' AND (key1 LIKE 'abcde%' OR key1 LIKE '%b')) 
    OR (key1 < 'bar' AND nonkey = 4) 
    OR (key1 < 'uux' AND key1 > 'z');
    

    注:上面的sql中key1是有索引的列,nonkey没有索引
    (1)where后面的条件,nonkey=4和like '%b'不能用于范围扫描,使用true替换

    (key1 < 'abc' AND (key1 LIKE 'abcde%' OR true)) 
    OR (key1 < 'bar' AND true) 
    OR (key1 < 'uux' AND key1 > 'z')
    

    (2)取消总是为true或false的条件

    (key1 LIKE 'abcde%' OR true)总是为true
    (key1 < 'uux' AND key1 > 'z')总是为false
    

    替换结果:

    (key1 < 'abc' AND TRUE) OR 
    (key1 < 'bar' AND TRUE) OR 
    (FALSE)
    

    (3)删除不必要的true和false

    (key1 < 'abc') OR (key1 < 'bar')
    

    (4)将重叠区间组合成一个用于范围扫描的最终条件

    (key1 < 'bar')
    

    4、mysql如何优化IS NULL

    (1)mysql可以对is null执行和常量等值判断相同的优化,mysql可以利用索引和范围来搜索空值
    (2)如果where子句包含一个为空的条件,但是对应列被声明为非空,那么IS NULL条件就会被优化掉
    (3)mysql也可以优化组合col_name = expr AND col_name IS NULL,这是解决子查询的一种常用形式。当使用优化时EXPLAIN显示ref_or_null
    。。。。。。

    相关文章

      网友评论

          本文标题:坚持打卡学习第八天——mysql中文文档学习四

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