我的查询很慢

时间:2016-09-02 10:20:05

标签: mysql doctrine-orm doctrine symfony

使用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)

我可以做两个查询,但我不明白这个问题

你能帮助我吗?

2 个答案:

答案 0 :(得分:2)

一些事情。

处理结果集的四秒钟,其中有25万行不慢。它实际上非常快。

进行JOIN操作时, SELECT *是有害的。最终会出现重复值的列。在具有25万行的结果集中,在MySQL服务器和客户端程序中都浪费了大量的时间和空间。而不是使用SELECT *,在结果集中提供所需列的列表。枚举所需的列也有助于MySQL查询规划器优化。通常,当查询确实很慢时,第一个优化步骤之一是减少列数。

请注意,连接两个表会导致组合爆炸。这就是JOIN的意思。您将返回与ON子句匹配的每个可能的记录对。如您所知,这是导致您麻烦的原因 - 530 x 430记录。

您没有描述您的数据。听起来table_btable_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