SQL多表关联筛选查询无响应卡顿问题求助
排查SQL查询卡顿无响应的问题及优化方案
原查询卡顿的核心原因
你的查询用逗号隐式关联了5张表,但没有为所有表设置有效的连接条件,导致数据库生成了海量笛卡尔积(即所有表的行进行全组合匹配)。比如如果每张表有1万条数据,组合后的行数会是天文数字,数据库根本无法处理,直接陷入卡顿。此外,OR条件会让查询优化器难以利用索引,进一步拖慢执行速度。
优化后的查询方案
应该把每个关联条件拆成独立的查询,用UNION(自动去重)或UNION ALL(不查重,速度更快)合并结果,这样每个分支只处理必要的表关联,彻底避免笛卡尔积:
SELECT users.id FROM users JOIN orders ON users.id = orders."orderUserId" WHERE orders."restaurantTableId" IN (12,7,9,8,10,11,14,99,100,6) UNION SELECT users.id FROM users JOIN "userEmailCollections" ON users.id = "userEmailCollections"."userId" WHERE "userEmailCollections"."restaurantId" = 6 UNION SELECT users.id FROM users JOIN "reviewTracks" ON users.email = "reviewTracks"."email" WHERE "reviewTracks"."restaurantId" = 6 UNION SELECT users.id FROM users JOIN "loyaltyCampaignRedemptions" ON users.id = "loyaltyCampaignRedemptions"."userId" WHERE "loyaltyCampaignRedemptions"."restaurantId" = 6;
如果允许结果中存在重复的用户ID(比如同一个用户满足多个条件),可以把UNION换成UNION ALL,执行效率会更高。
进一步优化:添加索引
为了让每个分支的查询更快,确保以下字段有索引:
- orders表:
"orderUserId"、"restaurantTableId" "userEmailCollections"表:"userId"、"restaurantId""reviewTracks"表:"email"、"restaurantId""loyaltyCampaignRedemptions"表:"userId"、"restaurantId"- users表:
email(主键id一般默认有索引)
内容的提问来源于stack exchange,提问作者Alk
相关产品推荐
相关产品推荐

