如何优化我的SQL查询?附具体查询语句
优化你的INSERT...SELECT SQL查询
让我来帮你优化这条插入查询,先把你的原始语句贴出来方便分析:
INSERT INTO inventorydetails (inventoryid, attributekeyid, lssmin) SELECT '194572', 1, LSS.attributekey FROM transactionlogs TL INNER JOIN lssinventory LSS ON LSS.sapsonumber = TL.sap WHERE TL.sap = '5001044323'
下面是几个针对性的优化建议:
添加索引加速关联与过滤
你的查询里,TL.sap既是过滤条件,又是关联LSS.sapsonumber的匹配键,全表扫描这两张表的话速度肯定慢。给这两个字段创建索引能让数据库快速定位目标数据:-- 给transactionlogs的sap字段建索引 CREATE INDEX idx_transactionlogs_sap ON transactionlogs(sap); -- 给lssinventory的sapsonumber字段建索引 CREATE INDEX idx_lssinventory_sapsonumber ON lssinventory(sapsonumber);索引建好后,数据库就能跳过全表扫描,直接通过索引找到符合条件的行,关联和查询速度会有明显提升。
确保关联字段数据类型一致
一定要检查TL.sap和LSS.sapsonumber的数据类型是否完全匹配(比如都是VARCHAR(15),或者都是数值类型)。如果类型不匹配,数据库会做隐式类型转换,这会导致索引失效,之前建的索引就白搭了,查询还是会慢。按需去重避免冗余插入
先单独跑一下SELECT部分,看看返回的attributekey有没有大量重复值:SELECT LSS.attributekey FROM transactionlogs TL INNER JOIN lssinventory LSS ON LSS.sapsonumber = TL.sap WHERE TL.sap = '5001044323'如果业务上不允许
inventorydetails出现重复的组合数据,就在SELECT里加上DISTINCT去重:INSERT INTO inventorydetails (inventoryid, attributekeyid, lssmin) SELECT DISTINCT '194572', 1, LSS.attributekey FROM transactionlogs TL INNER JOIN lssinventory LSS ON LSS.sapsonumber = TL.sap WHERE TL.sap = '5001044323'要是业务允许重复,这一步就可以跳过。
小细节:参数化常量(可选)
你当前用的是固定常量'194572'和1,如果后续要批量处理类似的插入,建议把这些值改成变量(比如应用层传参或者用SQL变量),这样复用性更高,也避免硬编码的维护问题。不过单条查询的话,这个影响不大。
内容的提问来源于stack exchange,提问作者Noki Da'Mighty
相关产品推荐
相关产品推荐

