Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
通过优化mysql内部连接组_Mysql_Query Optimization - Fatal编程技术网

通过优化mysql内部连接组

通过优化mysql内部连接组,mysql,query-optimization,Mysql,Query Optimization,我正在尝试优化以下查询 表1有500条记录 餐桌上的菜肴有10000条记录 当我在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

我正在尝试优化以下查询

表1有500条记录

餐桌上的菜肴有10000条记录

当我在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
我在联接中引用的每个字段上都有索引。我已经把桌子放在盘子上了

下面是解释的输出

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
我的问题有什么严重的问题吗?或者我应该找其他地方吗

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 
创建两个索引:

INDEXdishes_tbl.id_组、菜品_tbl.id_厨师、菜品选择 INDEXa.id,a.id\u厨师,a.squid
两个索引中的列顺序可能不是最理想的。

因此,使用或在联接中使用列顺序是一个可怕的想法。我将查询分为两个选择,每个选择联合在一起,每个选择只在一个条件下连接,它将查询速度提高了无穷大。

您能告诉我们更多关于表结构的信息以及它们包含哪些数据吗?这似乎是一个非常复杂的方法,可能有一个更简单的选择。每种海鲜都有x道菜,在完整的查询中,有很多大的难看的总和、平均数和其他东西的内部连接。我把所有的东西都去掉了,直到找到了它击中风扇的最小版本。