You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何使用索引反而引发更多行扫描?该选索引还是无索引?

索引选择疑问:临时表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)

问题

观察到无索引时扫描的行数更少,请问此时应该优先选择使用索引还是不使用索引?


答案

优先选择不使用索引,核心原因如下:

  1. 临时表数据量特性:临时表仅存在于当前会话,通常数据量不大。小数据量下,全表扫描可以一次性将数据加载到内存,避免索引带来的额外IO开销(读取索引页、索引维护成本),实际执行效率更高。
  2. 执行计划的估算参考:EXPLAIN的rows列是优化器基于统计信息给出的扫描行数估算,无索引时行数更少,说明优化器判定全表扫描需要处理的数据量更小,整体开销更低。
  3. 实际执行效率验证:实际执行两次查询对比耗时即可发现,小数据量的临时表场景下,全表扫描的执行速度几乎必然快于索引查找。

如果后续临时表的数据量会大幅增长,再考虑添加索引优化;当前场景下,不使用索引是更优选择。


内容的提问来源于stack exchange,提问作者Martin AJ

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 07:53:09