1:移除不必要的括号(优化解析速度)
例子:((aAND b)ANDcOR(((aANDb)AND (cANDd))))
优化后的结果:(aAND bANDc )OR(aANDbANDcANDd)
解析:从OR开始拆分,得到左右两部分条件,去除括号,合并条件优化解析时间
2:合并常量
例子:(a < bANDb=c)ANDa =5
优化结果:b>5ANDb=cANDa =5
解析:因为最后一个条件中a赋值为5,常量传递的原则,在第一个条件中a也为5,所以优化后的结果b>5
3:移除常量条件:
例子:(B>=5ANDB=5)OR (B=6AND5=5)OR(B=7AND5=6)
优化结果:B=5OR B=6
解析:首先使用OR将条件分为三部分,B>=5ANDB=5 , B=6AND 5=5 , B=7AND 5=6 ,第一部分中值传递B的值为5,所以B>=5的条件只成立B=5,第二部分中,5=5是个常量条件,可以忽略,条件中只有B=6。在第三部分中,5=6是一个不成立的条件,所以B=7AND 5=6都不成立所以,整个条件都可以忽略。优化后的结果整体优化了解析速度。
4:索引使用常量表达式只评估一次
5:COUNT(*) 如果在一个表中执行COUNT(*)操作,没有WHERE条件。结果将直接从MyISAM引擎或者MENORY表中获得。 这个也适用于针对单表得非空操作
6:对于无效的常量表达式(5=6),mysql在执行计划中快速移除,并没有结果返回
7: 如果没有使用GOUP BY 或者 aggregate 函数,就使用WHERE进行条件筛选
8:对于JOIN中的每个表,可以通过WHERE进行条件过滤,将一些数据过滤,可以提升JOIN的速度
9:在查询中,所有的常量表都比其他表优先读取。满足下面条件的都为常量表:
1:一个空的表或者表只有一行数据
2:一个表查询的时候,使用主键或者独立索引进行条件过滤,并且条件都不为空的时候。
例子:SELECT * FROM t WHERE primary_key=1; SELECT * FROM t1,t2 WHERE t1.primary_key=1 AND t2.primary_key=t1.id;
10:对于进行JOIN的表最好的组合是尝试所有的可能性。如果ORDER BY 和 GROUP BY中的列来自同一张表,那么这张表在JOIN时优先加入
11:如果使用SQL_SMALL_RESULT ,mysql将在内存中创建一个临时表
12:如果GROUP BY和ORDER BY的字段不是从join的第一个表中得来,一个临时表就会被创建
13:在结果返回前,没有匹配到结果得HVING都将跳过
网友评论