mysql 5.5 5.6查询速度比较
相同的索引、表结构,相同的查询语句在不同的库中查询速度差别过大,EXPLAIN查看后发现:
mysql5.5中的子查询生成的derived派生表不能有效使用索引,而5.6对此做了优化。
mysql5.5
mysql5.6
相同的查询语句,仅此次查询语句而言,查询速度5.6比5.5快10倍。
使用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方式。