网站地图    收藏   

主页 > 后端 > mysql数据库 >

高性能MySql进化论(九):查询优化器常用的优化方式

来源:自学PHP网    时间:2015-04-16 10:51 作者: 阅读:

[导读] 1 介绍1 1 处理流程当MYSQL 收到一条查询请求时,会首先通过关键字对SQL语句进行解析,生成一颗解析树,然后预处理器会校验解析树是否合法(主要校验数据列和表明是否存在,别...

1 介绍

1.1 处理流程

当MYSQL 收到一条查询请求时,会首先通过关键字对SQL语句进行解析,生成一颗“解析树”,然后预处理器会校验“解析树”是否合法(主要校验数据列和表明是否存在,别名是否有歧义等),当“解析树”被认为合法后,查询优化器会对这颗“解析树”进行优化,并确定它认为最完美的执行计划。

1.2 衡量标准

MYSQL查询优化器衡量某个执行计划是否完美的标准是“使用该执行计划时的成本”,该成本的最小单位是读取一个4K数据页的成本。

下面图中的数据说明,当使用id为条件查询时,查询的成本只有一个数据页,而使用mean(非索引)查询时,成本将近是22334个数据页

\

1.3 优化手段

下面列出了一些优化器常用的优化手段,但实际上远远不止这些

1. 重新定义关联表的顺序<喎"http://www.2cto.com/kf/ware/vc/" target="_blank" class="keylink">vcD4KPHA+ttTT2rbgse252MGqtcSy6dGvo6hJTlRFUiBKT0lOo6mjrNPFu6/G97vhuPm+3cr9vt21xNGh1PHQ1MC01tjQwr72tqi52MGqtcTLs9Dyo6zRodTx0NS437XEu+Gxu9bDx7ChozwvcD4KPHA+yOe5+7nYwarJ6LzGtb1O1cWx7aOs08W7r8b3u+GzosrUTqOh1ta1xLnYwarLs9Dyo6y009bQ0aGz9tK71tbX7tPFtcTFxcHQy7PQ8qOsyOe5+9PQMTDVxbHtvfjQ0LnYwaqjrL7N09AzNjI4ODAw1tbFxdDytcS/ycTco6zTxbuvxve/ycTc0OjSqr6tuf0zNjI4ODAwtM61xLOiytSyxcTctcO1vdK7uPbX7tPFtcTLs9DyoaPD5rbU1eLW1sr9wb+63LTztcTFxdDyyM7O8aOs08W7r8b3sqLDu9PQwM/Az8q1yrW1xLOiytQzNjI4ODAwtM6jrLb4yse1sbTvtb08c3Ryb25nPm9wdGltaXplcl9zZWFyY2hfZGVwdGg8L3N0cm9uZz7WuLaotcS0zsr9uvOjrL7Nu+GyydPDobDMsMC3xKPKvaGxvfjQ0LSmwO2ho9Xi0rKx7cP3udjBqrHttcTK/cG/srvE3MyrtuA8L3A+CjxwPiA8L3A+CjxwPrTLuabE3L/J0tTNqLn9U1RSQUlHSFRfSk9JTrnYvPzX1sC0vfjQ0MbBsc48L3A+CjxwPiA8L3A+CjxwPjIuICAgICAgIMXF0PLTxbuvPGJyPgq1sbK7xNzKudPDy/fS/b340NDFxdDyyrGjrE1ZU1FMu+G21L3hufu8r7340NDFxdDyo6zV4sqxuvK74bLJyKHBvdbWst/C1KO6o6gxo6nI57n7veG5+7yvtcTI3cG/0KHT2qGwxcXQ8ru6s+XH+KGxtcTI3cG/o6zU2sTatObW0L340NDFxdDyo6gyo6nI57n7sunRr7XEveG5+7Tz09qhsMXF0PK7urPlx/ihsaOs1PLPyL2rveG5+7yvsvC31rPJtuC49qGwxcXQ8ru6s+XH+KGxv8nS1MjdxMm1xNfTvK+jrMi7uvOw0bj3uPbX07yvxcXQ8rXEveG5+7Tmt8XU2rTFxczJz6Os1+6687bUuPe49tfTvK+9+NDQus+yojwvcD4KPHA+IDwvcD4KPHA+1NrFxdDytcS5/bPM1tDKudPDwdnKsbHttcS05rSiv9W85L/JxNzSqrHIyrW8yrXEtOa0or/VvOS087rctuCjrNb30qrKx9LyzqrU2sXF0PK1xMqxuvK2vLvhzqrDv7j219a2zrGjwfTX7rTztcS05rSiv9W85DwvcD4KPHA+IDwvcD4KPHA+tbG9+NDQudjBqrLp0a/FxdDyyrGjrMjnuftvcmRlciBiebXE19a2zsirsr/AtNfUtdrSu9XFse2jrNTy1Nq21LXa0rvVxbHtvfjQ0LnYwaq0psDtyrGjrL7Nu+G9+NDQxcXQ8rav1/ejqEV4dHJhINbQu+Gw/LqsPHN0cm9uZz5Vc2luZyBmaWxlc29ydDwvc3Ryb25nPqOpo6y38dTyu+G21Lbgse252MGquvO1xL3hufu9+NDQxcXQ8qOoRXh0cmEg1tCw/Lqso6w8c3Ryb25nPlVzaW5nIHRlbXBvcmFyeSwgVXNpbmcgZmlsZXNvcnQ8L3N0cm9uZz6jqaGjPC9wPgo8cD4gPC9wPgo8cD7U2k1ZU1FMNS42INaux7C1xLDmsb7W0KOsIExJTUlUudi8/NfWtcTX99PD1ru74dTaxcXQ8s3q1q6687LFyfrQp6Osy/nS1Ly0yrnU2rLp0a/W0LD8uqzBy0xJTUlUo6yy6dGvu7nKx7vhttS088G/tcTK/b7dvfjQ0LSmwO08L3A+CjxwPiA8L3A+CjxwPjMuICAgICAgILXIvNu55tTyPGJyPgrA/cjnILP2z9Ygd2hlcmUgNT01IGFuZCBhJmd0OzUgu+HXqruvs8l3aGVyZSBhJmd0OzU8L3A+CjxwPiA8L3A+CjxwPjQuICAgICAgIENPVU5UKCksTUlOKCksTUFYKCk8L3A+CjxwPrbU09pCLVRyZWXL99L9tvjR1KOsTWF4KCkvTWluKCm1xL3hufu31rHwt7W72LXEyse2/rLmyvfW0Nfu1/Ox39LUvLDX7tPSsd+1xCYjMjA1NDA7o6zL+dLUsrvQ6NKqvfjQ0LHttcS3w87Kvs2/ydLU1rG908ihtb221NOmtcQmIzIwNTQwO6GjPC9wPgo8cD621NPaQ291bnQoKbqvyv22+NHUo6zU2k1ZSVNBTdL9x+bW0M6su6TBy9K7uPa21NOmtcSzo8G/JiMyMDU0MDujrNKysrvQ6NKqttSx7b340NC3w87Kvs2/ydLU1rG908ihtb1Db3VudLXEJiMyMDU0MDuhozwvcD4KPHA+IDwvcD4KPHA+vq25/dXi1tbTxbuvuf21xFNRTCzU2kVYVFJB1tC74bP2z9YgPHN0cm9uZz6hsFNlbGVjdHRhYmxlcyBvcHRpbWl6ZWQgYXdheaGxPC9zdHJvbmc+tcTX1tH5PC9wPgo8cD4gPGltZyBzcmM9"http://www.2cto.com/uploadfile/Collfiles/20131205/20131204210307687.jpg" alt="\">

5. 转化为常数表达式

首先要说明的是,在数据库对查询进行处理的时候, 以常数(Constant)的方式进行处理的速度是最快的。查询优化器在优化的过程中,如果发现一个表达式可以转换为常数,就会将表达式转换为常数进行处理。

在优化阶段,一个查询也可以转换为常数,例如 在索引列上执行Min(),在where中对主键或者是唯一键进行条件限制等。

\

6. 覆盖索引扫描
参见:http://blog.csdn.net/eric_sunah/article/details/16830057

7. 提前终止
在下列几种情况中,查询会提前终止,并不再对表进行扫描

· 当优化器发现查询的结果已经满足查询需求的时候。比如查询中用到了LIMIT

· Where的条件不成立的时候。例如 where id>100 and id <10


8. 等值传播

对于通过列关联的查询,某列的where条件可以自动的从一张表传递到另外一张表,例如

Select film.filmid from film

Inter join film_actor using (filmid)

Where film.filmid>50;

上面的查询只是显示的指出film.filmid>50,但是优化器在优化的工程中会将其转化为

Where film.filmid>50 and film_actor.filmid>50.

9. 列表IN()的比较
…..where id in(2,4,1,3,8,6) 这种类型的限制条件在很多的RDBMS中等同于

where id=2 or id=4 or id=3 or id=8 or id=6.这种算法的复杂度是O(n).

而在MYSQL中,首先会对In列表进行排序,然后通过二分查找的方式进行比较,该方式的算法复杂度是O(log n).如果IN列表中的数据量非常的大,则效果会非常的明显

自学PHP网专注网站建设学习,PHP程序学习,平面设计学习,以及操作系统学习

京ICP备14009008号-1@版权所有www.zixuephp.com

网站声明:本站所有视频,教程都由网友上传,站长收集和分享给大家学习使用,如由牵扯版权问题请联系站长邮箱904561283@qq.com

添加评论