使用Symfony和Doctrine,我有一个非常简单的查询,但非常慢
530关于phpmyadmin的结果,0,0001秒:
SELECT
*
FROM
table_a T1
INNER JOIN
table_b T2 ON
T2.table_b.id = T1.id
WHERE
T1.id = 1
我加入第三张桌子:
在phpmyadmin上,245390结果(530 (来自table_b) X 430 (来自table_c)),4秒:
SELECT
*
FROM
table_a T1
INNER JOIN
table_b T2 ON
T2.table_b.id = T1.id
INNER JOIN
table_c T3 ON
T3.table_a.id = T1.id
WHERE
T1.id = 1
我有索引A = B和A = C(使用doctrine:schema:update)
我可以做两个查询,但我不明白这个问题
你能帮助我吗?
答案 0 :(得分:2)
一些事情。
处理结果集的四秒钟,其中有25万行不慢。它实际上非常快。
进行JOIN操作时, SELECT *是有害的。最终会出现重复值的列。在具有25万行的结果集中,在MySQL服务器和客户端程序中都浪费了大量的时间和空间。而不是使用SELECT *,在结果集中提供所需列的列表。枚举所需的列也有助于MySQL查询规划器优化。通常,当查询确实很慢时,第一个优化步骤之一是减少列数。
请注意,连接两个表会导致组合爆炸。这就是JOIN的意思。您将返回与ON
子句匹配的每个可能的记录对。如您所知,这是导致您麻烦的原因 - 530 x 430记录。
您没有描述您的数据。听起来table_b
和table_c
的行与table_a
分别相关,但彼此不相关。这可能意味着您应该使用一个查询检索table_a JOIN table_b
,并使用第二个查询检索table_a JOIN table_c
。
答案 1 :(得分:0)
这对我来说并不慢。但您可以使用 show profile / -s 功能检查资源的使用情况。它显示了查询的哪一部分是最慢的。
所需文件: http://dev.mysql.com/doc/refman/5.7/en/show-profiles.html http://dev.mysql.com/doc/refman/5.7/en/show-profile.html