INNER JOIN查询执行过慢问题求助
问题分析与优化方案
1. 调整过滤逻辑,减少关联数据量
把component_offer_unconnected表的非空判断从JOIN的ON子句移到WHERE子句,先过滤掉不符合条件的行再执行关联,能大幅减少参与JOIN的数据行数:
SELECT cou.id AS id, cou.title AS NAME, cou.ean AS ean, cou.productCode AS productCode, cou.tmpImg AS tmpImg, cou.userAccountName AS userAccountName, cou.userAccountId AS userAccountId, cou.complete AS complete, cou.active AS active, cou.stockAvailable AS stockAvailable FROM component_offer_unconnected cou WHERE cou.productCode != '' AND cou.ean != '' INNER JOIN products p ON( p.productCode = cou.productCode AND p.ean = cou.ean ) ORDER BY cou.id DESC
(注:给表起别名让SQL更简洁,不影响执行逻辑)
2. 创建复合索引,加速关联查询
你的JOIN条件是同时匹配productCode和ean,给products表创建这两个字段的复合索引,能让数据库快速定位到匹配的行,避免全表扫描:
CREATE INDEX idx_products_productcode_ean ON products (productCode, ean);
如果component_offer_unconnected表中productCode和ean非空的行占比不高,还可以给该表创建包含排序字段的复合索引,让WHERE过滤和ORDER BY都能利用索引:
CREATE INDEX idx_cou_productcode_ean_id ON component_offer_unconnected (productCode, ean, id);
3. 用执行计划验证优化效果
执行前先跑EXPLAIN查看执行计划,确认索引是否被正确使用:
EXPLAIN SELECT ... -- 替换成你的查询语句
重点看type列(避免ALL类型的全表扫描)和key列(确认用到了我们创建的索引)。
内容的提问来源于stack exchange,提问作者Mateusz
相关产品推荐
相关产品推荐

