设为首页 收藏本站
查看: 589|回复: 0

[经验分享] 高性能MySql进化论(十):查询优化器的局限性

[复制链接]

尚未签到

发表于 2016-10-22 09:16:19 | 显示全部楼层 |阅读模式
  在“查询优化器常用的方式”一文中列出了一些优化器常用的优化手段。查询优化器在提供这些特性的同时,也存在一定的局限性,这些局限性往往会随着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时,支持/不支持松散扫描的表扫描方式分别如下
   DSC0000.jpg
  由于B列是按照顺序排列的,所以只需要在固定的区间内查找就可以了,其余的记录可以跳过
   DSC0001.jpg

   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 ;

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-289680-1-1.html 上篇帖子: 字符集配置,解决jsp中文乱码,mysql中文乱码,java中文乱码等问题 下篇帖子: 使用Mysql的Blob要注意Blob最大限制到65K字节
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表