Mysql 在联接中使用依赖查询的慢速查询
我有以下的DB方案: 表“e_电车”中有数千辆“汽车”。 每辆车都可以在“e_vozy_typy”表中有更多关于车辆类型的信息记录。在表“e_vozy_dopravci”中有关于车主的信息,“e_vozy_razeni”和“e_vozy_evc”中有关于车辆登记等信息。 在列中,“poradi”具有最新的记录最大值和最旧的记录最小值(最小值通常为1) 我想写SELECT,它为每辆车返回来自其他表的最新信息 我尝试了以下几点:Mysql 在联接中使用依赖查询的慢速查询,mysql,performance,join,query-optimization,Mysql,Performance,Join,Query Optimization,我有以下的DB方案: 表“e_电车”中有数千辆“汽车”。 每辆车都可以在“e_vozy_typy”表中有更多关于车辆类型的信息记录。在表“e_vozy_dopravci”中有关于车主的信息,“e_vozy_razeni”和“e_vozy_evc”中有关于车辆登记等信息。 在列中,“poradi”具有最新的记录最大值和最旧的记录最小值(最小值通常为1) 我想写SELECT,它为每辆车返回来自其他表的最新信息 我尝试了以下几点: SELECT et.id aktevt.ntyp,
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秒。我可以在解释中看到,MySQL在连接中的依赖查询中不使用索引。是否有有效的解决方案?数据没有问题,但您可能需要对数据库进行非规范化,以提高性能并提供可链接的索引。在e_tram表中,为要加入的每个子表添加max_字段列,然后决定如何填充这些字段。可以在运行主查询之前对每个字段运行更新,也可以在I子表发生更改时使用触发器更新特定字段