mysql 嵌套查询性能_嵌套mysql查询的性能损失

在MySQL 5.7之前,嵌套查询可能导致显著的性能损失,因为派生表会作为临时表,导致额外开销。然而,从5.7版本开始,派生表的物化和外部查询的合并减少了这种影响。文章通过示例解释了不同版本中派生表的性能差异,并展示了EXPLAIN输出来说明查询优化。
摘要由CSDN通过智能技术生成

这个问题的答案取决于你是否在5.7之前或5.7之后使用mysql.我可能会略微改变你的问题,但希望以下内容能够捕捉到你所追求的内容.

SELECT * FROM Table通过聚簇索引(物理排序)进行表扫描.在没有主键的情况下,引擎可以使用一个主键.你说的没有where子句.不尝试过滤或选择其他索引.

Explain输出(见also)在摘要中显示1行.这是相对直接的.派生表B的解释输出和性能将根据您是否使用5.7之前的版本或5.7之后的版本而有所不同.

文档Derived Tables in 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

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

+----+-------------+-----------------+-------+-----------------+---------+---------+------+-------+----------------------------------------------------+

| 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 | | 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版本不是这种情况

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值