这篇是讨论关于处理WHERE子句的优化,下面的示例是用SELECT语句,同样的优化处理也适用于UPDATE和DELETE。
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_date与DATE_SUB(CURDATE(), INTERVAL 1 DAY) 比较。
5.在存储引擎为MyISAM和MEMORY的单表上执行没有WHERE 的 COUNT(*)时,行数从表信息里检索,而存储引擎为innoDB的表信息里记录的行数是大概值。
查询表信息:
SHOW TABLE STATUS LIKE '表名';
6.如果没有使用GROUP BY或COUNT(),MIN()等聚合函数,HAVING 将与WHERE合并。
7.以下两种情况会创建临时表:
ORDER BY的字段和GROUP BY的字段不同;
多表链接时,ORDER BY或GROUP BY的列不在join的第一个表的列中。
8.在WHERE字句上尽量使用索引,除非优化器认为全表扫描比利用索引更高效。
Reference:
https://dev.mysql.com/doc/refman/5.6/en/where-optimization.html
文章转载自胡翱蓝的网络日志,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




