0

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

表seafood_tbl有500条记录

表 discs_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

我对连接中引用的每个字段都有索引。我在 discs_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

我的查询是否有严重问题,或者我应该寻找其他地方?

4

2 回答 2

0

所以事实证明在 JOIN 中使用 OR 是一个可怕的想法。我将我的查询分成 2 个联合在一起的 SELECTS,每个 SELECTS 只在一个条件下加入,它将查询速度提高了无穷大。

于 2012-07-03T13:20:01.093 回答
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 

创建两个索引:

  • 索引(dishes_tbl.id_group,dishs_tbl.id_chef,dishes_tbl.choice)
  • 索引(a.id,a.id_chef,a.squid)

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

于 2012-07-03T10:31:08.540 回答