优化mysql选择查询多对一

时间:2011-08-16 12:22:27

标签: mysql select query-optimization one-to-many

我正在尝试优化mysql选择查询,但我无法弄清楚如何做到这一点。

我一直在这里阅读和谷歌上的任何其他相关结果,但找不到任何人我的问题,希望这不是因为我构建了非常糟糕的数据库表

我有三个表,表A,表B,表C

表A与表B具有一对一的关系

表A与表C具有一对多的关系

因为我需要表c中与表A中每行相关的所有信息,所以我使用GROUP BY将结果浓缩为表A中相关结果的数量。

不幸的是,当添加GROUP BY时,会导致mysql创建一个临时表,从而减慢所有内容。

我已经读过mysql将在哪些实例中使用一个临时表,看起来我应该能够使它工作但只是无法解决如何做到这一点,我希望我可以恢复我的查询与相同的结果,但没有tmp表,这使它变得缓慢。

我的查询中也有订单。如果我删除GROUP BY,我会获得表A中的所有行以及表C的准确结果但是它会在几分之一秒内完成所有这些。

使用GROUP BY并且有或没有ORDER BY,因为mysql然后使用tmp表,它需要2到15秒的时间,具体取决于所需的任何其他标准。

这基本上是我的查询(虽然出于安全原因而更改了详细信息)

SELECT 
table_a.*, table_b.*, table_c.*
FROM `table_a` 
LEFT JOIN table_b ON table_b.ID = table_a.table_b_id 
LEFT JOIN table_c ON table_a.ID = table_c.table_a_id AND table_c.deleted !='yes' 
WHERE table_a.deleted !='yes' AND table_b.deleted !='yes' 
GROUP BY table_a.ID 
ORDER BY table_a.date_added DESC

表a中有大约15k的结果,表c中有100k的结果

我真的需要表c中与表格中的行相关的所有信息,所以我的想法是

一个。我可以删除组并完成相同的最终结果,然后它将删除对tmp表的需要并加速全部
湾改变我如何将表连接在一起,以便对group by的结果进行排序更有效,然后希望删除tmp表

我是否可以提高此查询效率,或者因为我的表格设置方式而陷入困境?


感谢您的回复。

很抱歉我应该提到我已经尝试过group by,并且命令是table_a.ID的相同值,但是从mysql EXPLAIN这似乎仍然使用tmp表。

从测试开始,它似乎删除了顺序,并且只是按组仍然不起作用,虽然它本身的顺序很好,它只会带回所有结果。

在执行EXPLAIN时,我注意到table_a的possible_keys和key都为null,即使table_b和table_c都使用possible_keys和key的列进行报告。

我应该从EXPLAIN获得table_a有密钥的指示吗?

马特


对不起来自phpmyadmin,所以不是最好的布局。

id select_type表类型possible_keys键key_len ref rows Extra 1 SIMPLE table_a ALL NULL NULL NULL NULL 13297使用where;使用临时;使用filesort 1 SIMPLE table_b eq_ref PRIMARY,ID,PRIMARY 3 db.table_a.table_b_id 1使用where 1 SIMPLE table_c ref table_a_id table_a_id 3 db.table_a.ID 9

1 个答案:

答案 0 :(得分:0)

当你有不同字段的GROUP BY和ORDER BY时,你几乎总会得到一个临时表。

作为旁注,由于包含所有字段但仅按table_a.ID分组,因此选择可能会产生意外结果。表C中的记录可能会被破坏。