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

请求:无需IN语句重写SQL查询并优化其执行性能

优化海量数据下的SQL查询(替换IN语句)

嘿,我太懂你在海量数据里卡慢查询的痛苦了!原查询里用concat(comp_id,cus_id)配合IN子查询的写法,相当于直接废掉了comp_id和cus_id上的索引——数据库没法用索引快速定位,只能全表扫描,大数据量下肯定慢到让人抓狂。

下面是替换掉IN语句的优化版本,用**内连接(INNER JOIN)**实现完全相同的逻辑,同时把性能拉满:

SELECT t.* 
FROM trn t
INNER JOIN cus c 
    ON t.comp_id = c.comp_id 
    AND t.cus_id = c.cus_id
WHERE c.sid = 'A0001'
  AND t.docdate BETWEEN '2018-01-01' AND '2018-04-30'

为啥这写法更高效?

  • 别让函数挡住索引:原查询的concat()会让comp_id和cus_id的索引直接失效,改成直接字段匹配后,数据库能立刻用上这两个字段的索引快速定位数据。
  • JOIN的优化器支持更好:绝大多数数据库的查询优化器对JOIN的执行计划优化,比IN子查询要成熟得多,尤其是处理大数据集时,能更智能地选择最快的执行路径。

再加个性能buff(必做)

为了让这个查询起飞,建议给两张表加针对性的联合索引:

  • 给cus表建索引:CREATE INDEX idx_cus_sid_comp_cus ON cus(sid, comp_id, cus_id);
  • 给trn表建索引:CREATE INDEX idx_trn_comp_cus_docdate ON trn(comp_id, cus_id, docdate);

这些索引能让数据库直接通过索引过滤数据,不用扫描整张表,性能提升绝对肉眼可见。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 08:39:06