mysql 5.5 5.6查询速度比较

相同的索引、表结构,相同的查询语句在不同的库中查询速度差别过大,EXPLAIN查看后发现:

mysql5.5中的子查询生成的derived派生表不能有效使用索引,而5.6对此做了优化。

mysql5.5

mysql 5.5 5.6查询速度比较

mysql5.6

mysql 5.5 5.6查询速度比较

相同的查询语句,仅此次查询语句而言,查询速度5.6比5.5快10倍。

      使用5.5时注意的事项:(当然最好还是直接升级到5.6)

mysql 5.5 5.6查询速度比较

5.7又做了优化:

MySQL5.7之前的处理都是对Derived table进行Materialize,生成一个临时表保存Derived table的结果,然后利用临时表来协助完成其他父查询的操作,比如JOIN等操作,5.7中符合条件的子查询将直接与父查询的表合并进行直接JOIN。

符合条件是指:不包含

  • UNION clause 
  • GROUP BY 分组
  • DISTINCT  去重
  • Aggregation 聚合
  • LIMIT or OFFSET 
  • Derived table里面包含用户变量的设置。

Merge Derived table可以通过两种方式控制。

  • 通过开关optimizer_switch=’derived_merge=on|off’来进行控制。
  • 在CREATE VIEW的时候指定ALGORITHM=MERGE | TEMPTABLE, 默认是MERGE方式。