2012-01-26 112 views
0

我有以下數據庫計劃: scheme of my DB 表「e_tram」中有成千上萬的「汽車」。 每輛車可以有更多的記錄與表「e_vozy_typy」汽車類型的信息。在表「e_vozy_dopravci」中有關於所有者的信息,並且在「e_vozy_razeni」和「e_vozy_evc」中有關於汽車登記等的信息。 在「poradi」列中具有最新記錄最大值和最舊記錄最小值(最小值通常1)。緩慢查詢與依賴查詢JOIN

我想寫入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中的依賴查詢中使用索引。有沒有解決方案可以有效地做到這一點?

回答

0

數據沒有問題,但您可能需要對數據庫進行非規格化以提高性能並提供可鏈接的索引。在你的e_tram表中爲你加入的每個子表添加max_field列,然後決定你將如何填充這些字段。您可以在運行主查詢之前爲每個字段運行更新,或者當我更改子表時更新特定字段的觸發器。