RDS最佳实践(四)—如何处理Mysql的子查询

  • 时间:
  • 浏览:1

很多就剩下数据库版本了,RDS的版本是Mysql 5.5,而用户使用的数据库版本是5.6,很多问题图片很将会老出在这里,mysql 5.6和5.5在优化器上最大的改进很多对子查询的优化改进:

a.5.0、5.1、5.5对子查询处理:不要将子查询的结果集计算出来用作与這個表做join,很多很有将会outer 表每扫描二根数据,子查询总要被重新执行一遍,并且就原因性能下降;很多在5.5并且 的版本中,处理子查询的问题图片通常采用sql改写:将子查询改写为join的辦法 ;

5.5的执行计划:

b.5.6对子查询处理:将子查询的结果集cache到临时表里,临时表索引的主要目的是用来移除重复记录,這個并且也将会用于在做join时做查询使用,你這個技术在5.6中叫做Subquery Materialize.物化的子查询都时需看过select_type字段为SUBQUERY,而在MySQL5.5里为DEPENDENT SUBQUERY

SQL放慢就执行得到结果;RDS将会推出5.6的版本,届时都时需确定购买5.6的实例,同样也都时需将5.5,5.1的实例升级到5.6,处理我就诟病的子查询性能问题图片。

早上值班同事在旺旺群后面 贴了二根非常复杂化的SQL,用户从本地迁移到RDS Mysql老出严重性能下降,同样的数据和表型态下,在本地的数据库上若果只有1s的时间,這個在rds上好几分钟都没响应。

碰到类似于 问题图片时需考虑以下這個因素:

c.数据库的数据量不同(系统遇到bug,生成了絮状的垃圾数据),原因sql执行时间不同;

a.数据库的版本不同(不同的版本优化器策略不一样,将会异构数据库间的迁移:oracle–>mysql,sqlserver–>mysql),原因sql执行计划不同,最后原因sql执行时间不同;

PS.最佳实践:在oracle迁移到mysql的并且 ,请确定Mysql 5.6的版本,并且就都时需处理麻烦的子查询改写了。

RDS配置为:2150M内存,1150IOPS,本地是笔记本电脑:1500M的内存,51500转的笔记本电脑,很多数据库配置来说区别不须大;

b.数据库的配置不同(不同的内存配置,参数设置–query cache是是否是打开),原因sql执行时间不同;

根据以上线索,用户是并且 从线下迁移到RDS的,很多数据量和表型态是相同的;