我正在尝试优化以下查询。
table seafood_tbl有500条记录
table dishes_tbl有10,000条记录
当我在PHPmyadmin中运行它时,执行需要20秒,即永恒。
SELECT
SUM(a.squid)
FROM seafood_tbl a
INNER JOIN dishes_tbl b ON
( b.id_group = a.id AND b.choice =0 )
OR
( b.id_chef = a.id_chef AND ISNULL( b.id_group ))
GROUP BY a.id
我在连接中引用的每个字段都有索引。我在dishes_tbl上运行了OPTIMIZE TABLE。
以下是解释的输出。
1 SIMPLE a ALL PRIMARY NULL NULL NULL 505 Using temporary; Using filesort
1 SIMPLE b ref_or_null choice_index,id_group_index,id_chef id_group_index 5 a.id 4 Using where
我的查询是否存在严重错误,或者我应该在其他地方查找?
答案 0 :(得分:0)
SELECT SUM(a.squid)
FROM seafood_tbl a
INNER JOIN dishes_tbl b
ON ( b.id_group = a.id AND b.choice = 0 )
OR (ISNULL( b.id_group ) AND b.id_chef = a.id_chef)
GROUP BY a.id
创建两个索引:
两个索引中的列顺序可能不是最优的。
答案 1 :(得分:0)
所以事实证明在JOIN中使用OR是一个可怕的想法。我将我的查询分成两个联合在一起的SELECTS,每个只加入一个条件,并以无限因子加速查询。