为何使用索引反而引发更多行扫描?该选索引还是无索引?
索引选择疑问:临时表JOIN场景下是否使用索引?
相关SQL语句
查询语句
SELECT cc.number_card FROM customers_cards cc JOIN customers_card_psp ccp ON cc.id = ccp.card_id AND ccp.psp_id = '12' AND ccp.status = 'old_ofogh_koorosh' JOIN xxx ON xxx.card_number = cc.number_card
临时表xxx的创建语句
CREATE TEMPORARY TABLE xxx ( card_number varchar(191) COLLATE utf8mb4_unicode_ci )
执行计划对比
无索引时的EXPLAIN结果
- 扫描行数:优化器估算值更低
- 连接类型:全表扫描(ALL)
添加xxx(card_number)索引后的EXPLAIN结果
- 扫描行数:优化器估算值更高
- 连接类型:索引查找(ref)
问题
观察到无索引时扫描的行数更少,请问此时应该优先选择使用索引还是不使用索引?
答案
优先选择不使用索引,核心原因如下:
- 临时表数据量特性:临时表仅存在于当前会话,通常数据量不大。小数据量下,全表扫描可以一次性将数据加载到内存,避免索引带来的额外IO开销(读取索引页、索引维护成本),实际执行效率更高。
- 执行计划的估算参考:EXPLAIN的
rows列是优化器基于统计信息给出的扫描行数估算,无索引时行数更少,说明优化器判定全表扫描需要处理的数据量更小,整体开销更低。 - 实际执行效率验证:实际执行两次查询对比耗时即可发现,小数据量的临时表场景下,全表扫描的执行速度几乎必然快于索引查找。
如果后续临时表的数据量会大幅增长,再考虑添加索引优化;当前场景下,不使用索引是更优选择。
内容的提问来源于stack exchange,提问作者Martin AJ
相关产品推荐
相关产品推荐

