我正在尝试优化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
答案 0 :(得分:0)
当你有不同字段的GROUP BY和ORDER BY时,你几乎总会得到一个临时表。
作为旁注,由于包含所有字段但仅按table_a.ID分组,因此选择可能会产生意外结果。表C中的记录可能会被破坏。