优化mysql内连接组

时间:2012-07-03 10:23:37

标签: mysql query-optimization

我正在尝试优化以下查询。

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

我的查询是否存在严重错误,或者我应该在其他地方查找?

2 个答案:

答案 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 

创建两个索引:

  • INDEX(dishes_tbl.id_group,dishes_tbl.id_chef,dishes_tbl.choice)
  • INDEX(a.id,a.id_chef,a.squid)

两个索引中的列顺序可能不是最优的。

答案 1 :(得分:0)

所以事实证明在JOIN中使用OR是一个可怕的想法。我将我的查询分成两个联合在一起的SELECTS,每个只加入一个条件,并以无限因子加速查询。