首页 技术 正文
技术 2022年11月16日
0 收藏 735 点赞 2,641 浏览 1956 个字

这一章节讨论能够在WHERE处理语句中使用的优化. 样例使用SELECT 语句, 但是同样适用于DELETE,UPDATE语句中的WHERE语句.

注意

因为MYSQL优化器在不断的发展,MySQL执行的优化行为并不完全包含在这里.

你或许会重写你的查询来让计算操作更快,或许会牺牲一些可读性.你通常可以不用浪费这个时间,因为MySQL会自动执行相同的优化,
而且会让查询更加容易理解,更加容易维护.MySQL会执行如下优化:

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 //可以推导出 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.索引使用的常量表达只预估一次(MySQL索引基于代价模型)

5.COUNT(*)在单个数据表上执行,且没有where语句,结果直接从表信息中取回(对于MyISAM和MEMORY数据表)。同样也适用于在一个数据表上使用非空的表达式.

6.尽早的检测非法的常量表达式.某些SELECT 可能返回空的结果集.

7.如果没有使用GROUP BY或者其他聚合函数(COUNT(),MIN()….其他的聚合函数)HAVING会被合并到where

8.对于每一个join的数据表,会构造一个简单的WHERE语句来得到一个快速的WHERE评估,以此对表中的无用的行尽可能的跳过.

9.查询中所有常量表在其他表之前读取.常量表的定义如下:
1.空表或者只有一行的表
2.数据表的where条件使用主键或者唯一索引,索引的所有部分都在常量表达式内,并且定义为NOT NULL.

如下查询中所有的表都是常量表
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.如果ORDER BY和GROUP BY语句不同,或者如果ORDER BY,GROUP BY包含列来自的数据表和join队列里第一个数据表不同,一个临时表将会被创建.

12.如果你使用了SQL_SMALL_RESULT选项,MySQL使用内存临时表。

13.每个数据表的索引都会被查询,会使用一个最好的索引,除非优化器相信当前选择直接表扫描更加高效.从前,最佳索引判断是索引是否能够过滤表的
百分之30的数据.但是固定的百分比将不会是决定使用索引还是表扫描的因素. 当前的优化器现在更加复杂,基于包含其他因素的估价模型,比如表的大小,行的数目,
I/O块数目.

14.在有些样例下,MySQL能够从索引中直接读取行并且不用读取数据文件.如果索引中所有的行都是数字类型,仅使用索引树来解决查询.

15.在每行被输出前,不满足HAVING条件的行被跳过.

某些查询样例非常的快.
SELECT COUNT(*) FROM tbl_name;

SELECT MIN(key_part1),MAX(key_part1) FROM tb1_name;

SELECT MAX(key_part2) FROM tb1_name WHERE key_part1=constant

SELECT … FROM tb1_name ORDER BY key_part1,key_part2,….LIMIT 10

SELECT … FROM tb1_name ORDER BY key_part1 DESC,key_part2 DESC,…. LIMIT 10;

对于以下查询,MySQL只用索引树,假定索引的列是数字类型(numeric)

SELECT key_part1,key_part2 FROM tb1_name WHERE key_part1 =val;

SELECT COUNT(*) FROM tb1_name
WHERE key_part1=val1 AND key_part2=val2;

SELECT key_part2 FROM tb1_name GROUP BY key_part1;

以下查询使用索引按照排序顺序取回行而不用再次排序.
SELECT … FROM tb1_name
ORDER BY key_part1,key_part2,…

SELECT … FROM tb1_name ORDER BY key_part1 DESC,key_part2 DESC,….;

相关推荐
python开发_常用的python模块及安装方法
adodb:我们领导推荐的数据库连接组件bsddb3:BerkeleyDB的连接组件Cheetah-1.0:我比较喜欢这个版本的cheeta…
日期:2022-11-24 点赞:878 阅读:8,943
Educational Codeforces Round 11 C. Hard Process 二分
C. Hard Process题目连接:http://www.codeforces.com/contest/660/problem/CDes…
日期:2022-11-24 点赞:807 阅读:5,469
下载Ubuntn 17.04 内核源代码
zengkefu@server1:/usr/src$ uname -aLinux server1 4.10.0-19-generic #21…
日期:2022-11-24 点赞:569 阅读:6,283
可用Active Desktop Calendar V7.86 注册码序列号
可用Active Desktop Calendar V7.86 注册码序列号Name: www.greendown.cn Code: &nb…
日期:2022-11-24 点赞:733 阅读:6,098
Android调用系统相机、自定义相机、处理大图片
Android调用系统相机和自定义相机实例本博文主要是介绍了android上使用相机进行拍照并显示的两种方式,并且由于涉及到要把拍到的照片显…
日期:2022-11-24 点赞:512 阅读:7,729
Struts的使用
一、Struts2的获取  Struts的官方网站为:http://struts.apache.org/  下载完Struts2的jar包,…
日期:2022-11-24 点赞:671 阅读:4,766