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过滤一些数据。
我对这里的理解是查询的时候如果有常量表存在会先把对应字段替换掉
MysqL">-- 替换前
SELECT Table1.unique_not_null_column,Table2.any_column
FROM Table1,Table2
WHERE Table1.unique_not_null_column = Table2.any_column
AND Table1.unique_not_null_column = 5;
-- 替换后
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:
MysqL">SELECT key_part1,key_part2 FROM tbl_name WHERE key_part1=val;
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...
总结
以上是编程之家为你收集整理的Mysql手册-优化全部内容,希望文章能够帮你解决Mysql手册-优化所遇到的程序开发问题。
如果觉得编程之家网站内容还不错,欢迎将编程之家网站推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您喜欢交流学习经验,点击链接加入交流1群:1065694478(已满)交流2群:163560250