【问题标题】:MySQL join table with itself with OR conditionMySQL 使用 OR 条件将表与自身连接起来
【发布时间】:2016-12-20 18:07:21
【问题描述】:

我有一个表 FOLDERS,定义了类似目录结构的东西。它包含以下列: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)

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

有没有机会加快这个查询?

似乎“父文件夹”上的索引不起作用(LinkID、ParentId 和 ID(这是一个主键)上有索引,并且该表已被完全扫描。其中有 200K 行。

【问题讨论】:

  • 在查询前加上解释,用结果编辑您的问题。同时显示表格定义
  • 如果您无法更改查询,那么您几乎没有选择。如果您可以从查询中取出ORs,那么您拥有可能 对您有帮助的所有索引。 ORs 几乎消除了 MySQL 中的索引使用。

标签: mysql performance indexing mysql-5.1


【解决方案1】:

我假设 IDLinkID 都已编入索引。

OR 是杀手。您必须找到改变查询的方法;没有调优等可以解决性能问题。

LEFT 很可疑——如果没有父级,你想要 NULL 吗?

OR 可以变成UNION DISTINCT 的两个选择——一个带有OR 的任一侧。

【讨论】:

  • 嗨,瑞克!谢谢你的回答。我无法更改查询,因此无法解决问题。我们将尝试为此应用程序使用 MS SQL Server,或者我们将尝试使表更小。谢谢!
猜你喜欢
  • 2013-01-24
  • 1970-01-01
  • 1970-01-01
  • 2021-06-13
  • 2014-05-31
  • 1970-01-01
  • 1970-01-01
  • 2015-01-01
  • 2014-02-12
相关资源
最近更新 更多