请求:无需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
相关产品推荐
相关产品推荐

