什么是性能损失SELECT * FROM Table
VS SELECT * FROM (SELECT * FROM Table AS A) AS B
我的问题是:首先, SELECT * 是否涉及表中行的迭代,或者它只是将所有行作为一个块返回而不进行任何迭代(因为没有给出 WHERE 子句),如果是这样,示例中的嵌套查询也会这样做两个涉及对表进行两次迭代,并且将花费第一次查询时间的两倍?谢谢...
这个问题的答案取决于你使用的是5.7之前的mysql,还是5.7及之后的版本。我可能会稍微改变你的问题,但希望以下内容能够满足你的需求。
Your SELECT * FROM Table
通过聚集索引(物理顺序)进行表扫描。在没有主键的情况下,一是隐含地可供发动机使用。没有你说的where子句。不尝试过滤或选择其他索引。
The Explain输出(参见also) 在其摘要中显示 1 行。它相对简单。使用派生表解释输出和性能B
根据您使用的是 5.7 之前的版本还是 5.7 及之后的版本,情况会有所不同。
该文件MySQL 5.7 中的派生表很好地描述了版本 5.6 和 5.7,其中后者不会因为物化派生表输出的更改被合并到外部查询中而提供任何惩罚。在以前的版本中,派生的临时表承受了大量的开销。
在 5.7 之前测试性能损失是相当容易的。只需一张中等大小的表即可看到问题的派生表对性能的显着影响。下面的例子是在5.6版本的一个小表上:
explain
select qm1.title
from questions_mysql qm1
join questions_mysql qm2
on qm2.qid<qm1.qid
where qm1.qid>3333 and qm1.status='O';
+----+-------------+-------+-------+-----------------+---------+---------+------+-------+------------------------------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------+-------+-----------------+---------+---------+------+-------+------------------------------------------------+
| 1 | SIMPLE | qm1 | range | PRIMARY,cactus1 | PRIMARY | 4 | NULL | 5441 | Using where |
| 1 | SIMPLE | qm2 | ALL | PRIMARY,cactus1 | NULL | NULL | NULL | 10882 | Range checked for each record (index map: 0x3) |
+----+-------------+-------+-------+-----------------+---------+---------+------+-------+------------------------------------------------+
explain
select b.title from
( select qid,title from questions_mysql where qid>3333 and status='O'
) b
join questions_mysql qm2
on qm2.qid<b.qid;
+----+-------------+-----------------+-------+-----------------+---------+---------+------+-------+----------------------------------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-----------------+-------+-----------------+---------+---------+------+-------+----------------------------------------------------+
| 1 | PRIMARY | qm2 | index | PRIMARY,cactus1 | cactus1 | 10 | NULL | 10882 | Using index |
| 1 | PRIMARY | <derived2> | ALL | NULL | NULL | NULL | NULL | 5441 | Using where; Using join buffer (Block Nested Loop) |
| 2 | DERIVED | questions_mysql | range | PRIMARY,cactus1 | PRIMARY | 4 | NULL | 5441 | Using where |
+----+-------------+-----------------+-------+-----------------+---------+---------+------+-------+----------------------------------------------------+
请注意,我确实更改了问题,但它说明了派生表及其缺乏优化器索引使用对 5.7 之前版本的影响。派生表在具体化时受益于索引。但此后它作为临时表承受开销,并合并到外部查询中而不使用索引。 5.7 版本中并非如此
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)