我有一个表FOLDERS,它定义了类似目录结构的smth。它包含以下列:ID,PARENT_ID和LINK_ID。

我现在无法更改查询缓慢的应用程序。

此应用程序具有PARENT_ID可以同时引用ID或LINK_ID的逻辑。

另外,我无法更改查询,发现它减慢了整个ETL过程的速度:

SELECT  folders.ID AS OrigFolderID, parentfolder.ID, parentfolder.Name
FROM    folders
          LEFT JOIN folders AS parentfolder ON folders.ParentID=parentfolder.ID OR folders.ParentID=parentfolder.LinkID
WHERE   folders.ID IN                (112450385,188823933,211307470,211403833,211545367,212449523,212539966)


但是,我们可以更改数据库,删除或添加索引。

有机会加快此查询的速度吗?

似乎“ parentfolder”上的索引不起作用(LinkID,ParentId和ID(这是主键)上存在索引,并且表已被完全扫描,其中有20万行。

最佳答案

我假设IDLinkID都已索引。

OR是杀手.。您必须找到一种更改查询的方法。没有调整等,可以解决性能问题。

LEFT是可疑的-如果没有父项,是否要为NULL?

OR可以变成两个选择的UNION DISTINCT-一个在OR的任一侧。

关于mysql - MySQL连接表本身具有OR条件,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/41248673/

10-11 00:16