Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 在联接中使用依赖查询的慢速查询_Mysql_Performance_Join_Query Optimization - Fatal编程技术网

Mysql 在联接中使用依赖查询的慢速查询

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,

我有以下的DB方案: 表“e_电车”中有数千辆“汽车”。 每辆车都可以在“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秒。我可以在解释中看到,MySQL在连接中的依赖查询中不使用索引。是否有有效的解决方案?

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