在JOIN中使用相关查询进行慢查询

时间:2012-01-26 16:26:45

标签: mysql performance join query-optimization

我有以下数据库方案: scheme of my DB 表“e_tram”中有数千个“汽车”。 每辆车都有更多记录,其中包含表格“e_vozy_typy”中有关汽车类型的信息。在表“e_vozy_dopravci”中有关于所有者的信息,在“e_vozy_razeni”和“e_vozy_evc”中有关于汽车登记等的信息。 在列“poradi”中有最新的记录最大值和最早的记录最小值(最小值通常为1)。

我想写SELECT,它为每辆车返回其他表中的最新信息。

我试过以下:

SELECT
    et.id

    aktevt.ntyp,
    aktevt.typ, 

    akteve.evc,
    akteve.ind,

    aktevr.razeni,

FROM e_tram AS et

INNER JOIN (
    SELECT idvozu, MAX(poradi) AS aktporadi
    FROM e_vozy_typy AS evt
    GROUP BY evt.idvozu
)   AS evt
    ON et.id = evt.idvozu

INNER JOIN e_vozy_typy AS aktevt
    ON et.id = aktevt.idvozu AND evt.aktporadi = aktevt.poradi


INNER JOIN (
    SELECT idvozu, MAX(poradi) AS aktporadi
    FROM e_vozy_dopravci AS evd
    GROUP BY evd.idvozu
)   AS evd
    ON et.id = evd.idvozu

INNER JOIN e_vozy_dopravci AS aktevd
    ON et.id = aktevd.idvozu AND evd.aktporadi = aktevd.poradi


INNER JOIN (
    SELECT idvuzdopravce, MAX(poradi) AS aktporadi
    FROM e_vozy_evca AS eve
    GROUP BY eve.idvuzdopravce
)   AS eve
    ON aktevd.id = eve.idvuzdopravce

INNER JOIN e_vozy_evca AS akteve
    ON aktevd.id = akteve.idvuzdopravce 
        AND eve.aktporadi = akteve.poradi


LEFT JOIN (
    SELECT idvuzdopravce, MAX(poradi) AS aktporadi
    FROM e_vozy_razeni AS evr
    GROUP BY evr.idvuzdopravce
)   AS evr
    ON aktevd.id = evr.idvuzdopravce

LEFT JOIN e_vozy_razeni AS aktevr
    ON aktevd.id = aktevr.idvuzdopravce 
        AND evr.aktporadi = aktevr.poradi


GROUP BY et.id

ORDER BY akteve.evc, akteve.ind, et.id

尽管所有列id(+外键列)和poradi都有索引,但此查询大约需要90秒。我在EXPLAIN中可以看到MySQL在JOIN中的依赖查询中不使用索引。有效解决这个问题吗?

1 个答案:

答案 0 :(得分:0)

数据没有问题,但您可能需要对数据库进行非规范化以提高性能并提供可链接的索引。在e_tram表中,为要加入的每个子表添加max_field列,然后决定如何填充这些字段。您可以在运行主查询之前为每个字段运行更新,也可以在I子表更改时更新特定字段的触发器。