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.会最先被读。
我对这里的理解是查询的时候如果有常量表存在会先把对应字段替换掉
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...
原文地址:https://www.jb51.cc/wenti/411564.html
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。