mysql语句优化笔记
笔记主要记录语句优化。
优化SELECT 语句
WHERE 语句优化
1.删除不必要的括号
牺牲可读性来提高算术运算,因为mysql优化器会执行类似的优化
2.折叠常量
5 AND b = c AND a = 5
3.移除恒定条件
= 5 AND B = 5) OR (b = 6 AND 5 = 5) OR (b = 7 AND 5 = 6)
-- 优化后
b = 5 OR b = 6
4.索引使用的常量表达式仅被计算一次
我的理解是使用NOW() 每一行都得计算对比一次。另外使用NOW() 还不会被缓存。
5.避免使用COUNT(*) ,NOT NULL 。
6.检测无效常量表达式,不然返回空行。
7.没有合计方法或者GROUP BY 的时候不使用HAVING 。
8.JOIN 表的时候尽量用WHERE 过滤一些数据。
9.会最先被读。
我对这里的理解是查询的时候如果有常量表存在会先把对应字段替换掉
-- 替换后
SELECT 5,Table2
WHERE 5 = Table2.any_column
AND 5 = 5;
10.使用最佳的JOIN 组合。
如果ORDER BY和GROUP BY子句中的所有列 都来自同一个表,则在加入时首先首选该表
11.ORDER BY 与GROUP BY 连用时最好是同一张表。
如果存在ORDER BY 子句和不同的GROUP BY 子句,或者如果ORDER BY 或者GROUP BY 包含连接队列中第一个表以外的表中的列,则会创建临时表。
12.如果使用SQL_SMALL_RESULT 修饰符,MySQL使用内存临时表。
还不明白,待查询
13.使用最佳索引查表,除非优化器认为全表扫描更快。
10
即使id为主键 还是会全表扫描。因为b > 10需要全表扫描,使用索引查询为多此一举。
14.在某些情况下,MySQL甚至无需咨询数据文件即可从索引中读取行。如果索引中使用的所有列都是数字,则仅使用索引树来解析查询。
MySQL resolves the following queries using only the index tree,assuming that the indexed columns are numeric:
SELECT COUNT(*) FROM tbl_name WHERE key_part1=val1 AND key_part2=val2;
SELECT key_part2 FROM tbl_name GROUP BY key_part1;
对于联合索引a ,b ,c 来说,在Innodb 存储引擎下,使用b ,c 也能使用索引(索引覆盖)。Myisam 引擎是用不到索引的。
15.在每个记录被输出前,那些不匹配HAVING子句的行被跳过。
???没明白这句话的含义
16.因为索引是按顺序排列的,所以按照索引使用ORDER BY 的话无需重新排序
SELECT ... FROM tbl_name
ORDER BY key_part1 DESC,key_part2 DESC,... ;
TO BE CONTINUE... (编辑:李大同)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|