暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

SQL优化-WHERE子句优化

胡翱蓝的网络日志 2021-09-11
499

这篇是讨论关于处理WHERE子句的优化,下面的示例是用SELECT语句,同样的优化处理也适用于UPDATEDELETE


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


      3.去除无用的常数条件:

        (b>=5 AND b=5) OR (b=6 AND 5=5) OR (b=7 AND 5=6)
        -> b=5 OR b=6


        4.如果索引列的条件是常数的表达式,那么只会计算一次:

          start_date >= DATE_SUB(CURDATE(), INTERVAL 1 DAY)

          如果是今天内执行,等同于:

            start_date >= '2021-05-01'

            优化器会将常数的表达式解析为常数,在执行阶段执行器会很容易找到索引start_date >= '2021-05-01' 的行,而不是提取每一行的start_dateDATE_SUB(CURDATE(), INTERVAL 1 DAY) 比较。


            5.在存储引擎为MyISAMMEMORY的单表上执行没有WHERECOUNT(*)时,行数从表信息里检索,而存储引擎为innoDB的表信息里记录的行数是大概值。

            查询表信息:

              SHOW TABLE STATUS LIKE '表名';


              6.如果没有使用GROUP BYCOUNT(),MIN()等聚合函数,HAVING 将与WHERE合并。


              7.以下两种情况会创建临时表:

              1. ORDER BY的字段和GROUP BY的字段不同;

              2. 多表链接时,ORDER BYGROUP BY的列不在join的第一个表的列中。


              8.在WHERE字句上尽量使用索引,除非优化器认为全表扫描比利用索引更高效。



              Reference:

              https://dev.mysql.com/doc/refman/5.6/en/where-optimization.html

              文章转载自胡翱蓝的网络日志,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

              评论