OptimizationsforderivedtablesinMySQL5.6andMariaDB5._MySQL
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了OptimizationsforderivedtablesinMySQL5.6andMariaDB5._MySQL,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3975字,纯文字阅读大概需要6分钟。
内容图文
![OptimizationsforderivedtablesinMySQL5.6andMariaDB5._MySQL](/upload/InfoBanner/zyjiaocheng/581/03b59797b43348a097af738d171a257d.jpg)
I had been involved with subquery optimizations fairly closely, but last week I was surprised to find out that MySQL 5.6 does not supportderived table merging. This feature was among the subquery features in the abandoned MySQL 6.0. In MariaDB, it was finished and released as part ofMariaDB 5.3/5.5. As for MySQL, neither MySQL 5.6, nor MySQL 5.7 has this feature.
So what is this “derived merge”? It’s simple to understand. When one writes complex queries, it is common to use FROM-clause subqueries as a way to structure the query:
selectsum(o_totalprice)from(select * from orders where o_orderpriority=’1-URGENT’) as high_prio_orderswhereo_orderdate between ‘1995-01-01′ and ‘1995-01-07′
MySQL optimizer processes this syntax very poorly. The basic problem is thatFROM-subqueries are always materialized exactly as-specified. Conditions from outside the subquery are applied only after the materialization.
In our example, tableorders
has an index ono_orderdate
, and there is a highly selective conditiono_orderdate BETWEEN ...
which one can use for reading through the index. But the condition is located outside the subquery, so it will not be used when reading the table. Instead, we will get the following plan:
+----+-------------+------------+------+---------------+------+---------+------+---------+-------------+| id | select_type | table| type | possible_keys | key| key_len | ref| rows| Extra |+----+-------------+------------+------+---------------+------+---------+------+---------+-------------+|1 | PRIMARY |
| ALL| NULL| NULL | NULL| NULL | 1505799 | Using where ||2 | DERIVED | orders | ALL| NULL| NULL | NULL| NULL | 1505799 | Using where | +----+-------------+------------+------+---------------+------+---------+------+---------+-------------+
The meaning of it is:
- Do a full table scan is on table `orders`. We expect to read 1.5M rows. Write rows that match
o_orderpriority='1-URGENT'
into a temporary table - Read the temporary table back. Filter rows that match
o_orderdate between ...
and compute the query result
MySQL 5.6 has added some improvements to this (link to the manual). They are:
- The temporary table is materialized as late as possible. This has no effect of the speed of our example query, but it may have an effect for more complex queries.
- EXPLAIN also will not materialize the temporary table
- The optimizer has an option to create and use an index on the temporary table.
However, the base problem of materializing FROM subquery before applying any other optimization still remains.
In MariaDB, EXPLAIN will be different:
+------+-------------+--------+-------+---------------+---------------+---------+------+------+------------------------------------+| id | select_type | table| type| possible_keys | key | key_len | ref| rows | Extra|+------+-------------+--------+-------+---------------+---------------+---------+------+------+------------------------------------+|1 | SIMPLE| orders | range | i_o_orderdate | i_o_orderdate | 4 | NULL | 4358 | Using index condition; Using where |+------+-------------+--------+-------+---------------+---------------+---------+------+------+------------------------------------+
Note that we see only one line, and the table orders is accessed through an index ono_orderdate
. RunningEXPLAIN EXTENDED
will show why:
Message: select sum(`dbt3sf1`.`orders`.`o_totalprice`) AS `sum(o_totalprice)` from `dbt3sf1`.`orders` where ((`dbt3sf1`.`orders`.`o_orderpriority` = ‘1-URGENT’) and (`dbt3sf1`.`orders`.`o_orderDATE` between ‘1995-01-01′ and ‘1995-01-07′))
There is no FROM-clause subquery anymore. It has been merged into the upper select. This allowed the optimizer to avoid doing materialization, and also to use the condition and index ono_orderdate
to construct arange
access.
Query execution time for this particular example went down from 15 sec to 0.25 sec, but generally, the difference can be as big as your table is big.
Posted inhow-it-works,mysql,mariadbon June 30th, 2014 by spetrunia| |
内容总结
以上是互联网集市为您收集整理的OptimizationsforderivedtablesinMySQL5.6andMariaDB5._MySQL全部内容,希望文章能够帮你解决OptimizationsforderivedtablesinMySQL5.6andMariaDB5._MySQL所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。