高性能MySql进化论(十):查询优化器的局限性

浏览:
字体:
发布时间:2013-12-15 22:18:46
来源:

在“查询优化器常用的方式”一文中列出了一些优化器常用的优化手段。查询优化器在提供这些特性的同时,也存在一定的局限性,这些局限性往往会随着MYSQL版本的升级而得到改善,所以本文会列出一些常见的局限性,且不包含所有的。 

1.1 关联子查询

描述:

因为select …from table1 t1 where t1.id in(select t2.fk from table2 t2 wheret2.id=’…’) 类型的语句往往会被优化成 select …. From table1 t1 where exists (select* from table2 t2 where t2.id=’…’ and t2.fk=t1.id), 由于在进行tabl2查询时, table1的值还无法确定, 所以会对table1进行全表扫描

解决方案:

尽量用 INNER JOIN 替代 IN(),重写成 select * from table1 t1 inner jointable2 t2 using (id) where t2.id=’…’

1.2 UNION的限制

描述:

UNION操作不会把UNION外的操作推送到每个子集

解决方案:

为每个子操作单独的添加限制条件

例如 学生表有10000条记录,会员表有10000表记录,如果想按照姓名排序取两个表的前20条记录,如果在各个子查询中添加limit的话,则最外层的limit操作将会从40条记录中取20条,否则是从20000条中取20条 

(select name from student order by name limit 20) union all (select name from memberorder by member limit 20) limit 20 

1.3 等值传递

在进行查询操作的时候 IN,ON,Using,等操作往往会把一个列表的值在多个表之间共享,而优化器为了优化的方便会把列表里的值为每个相关表都拷贝一份,如果这个列表非常的大,会对性能造成一定的影响.

目前为止还没有好的策略应对这个问题

1.4 并行执行

目前為止,MYSQL不支持

1.5 哈希关联

目前MYSQL唯一支持的是循环嵌套关联,不支持HASH关联

1.6 松散索引扫描

描述:所谓的松散索引就是当对表进行扫描是,可以智能的跳过一些记录,以此来减少需要扫描的记录行数.为了更清楚的说明这个问题,举个例子来说明松散索引扫描的好处,例如table1表上有索引(a,b),执行 select * from tabl1 where b between2 and 3时,支持/不支持松散扫描的表扫描方式分别如下

/

由于B列是按照顺序排列的,所以只需要在固定的区间内查找就可以了,其余的记录可以跳过

/

B不是索引的第一字段,所以只能从第一条找到最后一条

上面两个图可以很明显的说明松散索引的好处,但是Mysql对这个特性的支持不是很好,只针对某些特殊的查询才提供此优化,具体的要看各个版本的手册 

1.7 Max()/MIN()

问题描述:

当执行 select max(id) from table1 where name=’sun’ 时,如果name没有建立相应的索引,MYSQL会进行全表扫描

解决方案:

将SQL等同的转化为

select id from table1 use index(PRIMARY) wherename=’sun’ limit 1.
这样的语句会尽可能少的扫描表记录

1.8 同一个表的查询以及更新

问题描述:

不能在查询某个表的同时对表进行更新 

Update table1t1 set  t1.cnt=(select count(*) fromtable1) 

否则会抛出异常: ERROR 1093 (HY000): You can'tspecify target table 'ftsexchangerate' for update in FROM clause

解决办法: 转化成关联表的形式

update ftsexchangerate inner join(select currency,count(*) as cnt from ftsexchangerate group by (currency) ) as innusing(currency)set ftsexchangerate.description=inn.cnt ;
>更多相关文章
24小时热门资讯
24小时回复排行
资讯 | QQ | 安全 | 编程 | 数据库 | 系统 | 网络 | 考试 | 站长 | 关于东联 | 安全雇佣 | 搞笑视频大全 | 微信学院 | 视频课程 |
关于我们 | 联系我们 | 广告服务 | 免责申明 | 作品发布 | 网站地图 | 官方微博 | 技术培训
Copyright © 2007 - 2024 Vm888.Com. All Rights Reserved
粤公网安备 44060402001498号 粤ICP备19097316号 请遵循相关法律法规
');})();