您好,欢迎来到化拓教育网。
搜索
您的当前位置:首页1025WHERE执行顺序以及MySQL查询优化器

1025WHERE执行顺序以及MySQL查询优化器

来源:化拓教育网
1025WHERE执⾏顺序以及MySQL查询优化器

转⾃http://blog.csdn.net/zhanyan_x/article/details/25294539

-- WHERE执⾏顺序

-- 过滤⽐较多的放在前⾯,然后更加容易匹配,从左到右进⾏执⾏;⼀般都是优化器很智能的优化了,⽆需⽤户处理-- 如何查看优化后的语句EXPLAIN EXTENDED

SELECT SQL_NO_CACHE * FROM db.table

WHERE is_day=1 AND DATE(ex_date)='2015-07-01' ;SHOW WARNINGS;

-- 第⼀种确实⽐第⼆种要慢⼀点EXPLAIN EXTENDED

SELECT SQL_NO_CACHE * FROM TABLEWHERE is_day=1 AND run_date='2015-07-01'EXPLAIN EXTENDED

SELECT SQL_NO_CACHE * FROM TABLEWHERE run_date='2015-07-01' AND is_day=1

此⽂章主要向⼤家描述的是查询优化系列之MySQL查询优化器,当你在对⼀查询进⾏提交的时候,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 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,因为这样做开销更⼩。

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- huatuo9.cn 版权所有 赣ICP备2023008801号-1

违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务