作者:骑着羊赶着狼 | 来源:互联网 | 2014-05-12 08:59
当你提交一个查询的时候,MySQL会分析它,看是否可以做一些优化使处理该查询的速度更快。这一部分将先容查询优化器是如何工作的。假如你想知道MySQL采用的优化手段,可以查看My
当你提交一个查询的时候,MySQL会分析它,看是否可以做一些优化使处理该查询的速度更快。这一部分将先容查询优化器是如何工作的。假如你想知道MySQL采用的优化手段,可以查看MySQL参考手册。
当然,MySQL查询优化器也利用了索引,但是它也应用了其它一些信息。例如,假如你提交如下所示的查询,那么无论数据表有多大,MySQL履行它的速度都会非常快:
SELECT * FROM tbl_name WHERE 0;
在这个例子中,MySQL查看WHERE子句,熟悉到没有符合查询条件的数据行,因此基本就不考虑搜索数据表。你可以通过供给一个EXPLAIN语句看到这种情况,这个语句让MySQL显示自己履行的但实际上没有真正地履行的SELECT查询的一些信息。假如要应用EXPLAIN,只需要在EXPLAIN单词放在SELECT语句的前面:
mysql> EXPLAIN SELECT * FROM tbl_name WHERE 0\G
***************************
1. row ***************************
id: 1
select_type: SIMPLE
table: NULL
type: NULL
possible_keys: NULL
key: NULL
key_len: NULL
ref: NULL
rows: NULL
Extra: Impossible WHERE
通常情况下,EXPLAIN返回的信息比上面的信息要多一些,还包含用于扫描数据表的索引、应用的联结类型、每张数据表中估计需要检查的数据行数目等非空(NULL)信息。
优化器是如何工作的
MySQL查询优化器有几个目标,但是其中最重要的目标是尽可能地应用索引,并且应用最严格的索引来打消尽可能多的数据行。你的终极目标是提交SELECT语句查找数据行,而不是消除数据行。优化器试图消除数据行的原因在于它消除数据行的速度越快,那么找到与条件匹配的数据行也就越快。假如能够首先进行最严格的测试,查询就可以履行地更快。假设你的查询检验了两个数据列,每个列上都有索引:
SELECT col3 FROM mytable
WHERE col1 = ’some value’ AND col2 = ’some other value’;
假设col1上的测试匹配了900个数据行,col2上的测试匹配了300个数据行,而同时进行的测试只得到了30个数据行。先测试Col1会有900个数据行,需要检查它们找到其中的30个与col2中的值匹配记录,其中就有870次是失败了。先测试col2会有300个数据行,需要检查它们找到其中的30个与col1中的值匹配的记录,只有270次是失败的,因此需要的盘算和磁盘I/O更少。其成果是,优化器会先测试col2,由于这样做开销更小。