通过优化mysql内部连接组
我正在尝试优化以下查询 表1有500条记录 餐桌上的菜肴有10000条记录 当我在PHPmyadmin中运行它时,需要20秒来执行通过优化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
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道菜,在完整的查询中,有很多大的难看的总和、平均数和其他东西的内部连接。我把所有的东西都去掉了,直到找到了它击中风扇的最小版本。