【发布时间】:2018-08-27 16:26:22
【问题描述】:
我有两个表,它们的 Id 索引了大约 100 万行。
闲置查询...
SELECT t.* FROM transactions t
INNER JOIN integration it ON it.id_trans = t.id_trans
WHERE t.id_trans = '5440073'
OR it.id_integration = '439580587'
此查询大约需要 30 秒。但是……
SELECT ... WHERE t.id_trans = '5440073'
花费不到 100 毫秒并且
SELECT ... WHERE it.id_integration = '439580587'
也需要不到 100 毫秒。甚至
SELECT ... WHERE t.id_trans = '5440073'
UNION
SELECT ... WHERE it.id_integration = '439580587'
不到 100 毫秒
为什么 OR 子句即使零件速度如此之快也要花费这么多时间?
【问题讨论】:
-
“我应该怎么做才能提高这个查询的性能?” 你已经做到了;将此类有问题的 OR 条件拆分为连接查询是处理这种情况的标准方法之一。问题是因为 MySQL 不能在一个(非 UNIONed)查询中同时使用两个索引。
-
有趣,Uueerdo。这是 MySQL 特有的吗?
-
我只是在 MySQL 上非常熟悉它,但快速谷歌搜索“MSSQL OR Performance”表明这个问题更为普遍。可能是由于实现优化与效果;抽象地说,
WHERE应该在FROM中的所有内容之后发生,但是为了使事情变得更快,大多数 SQL 实现会通过首先使用 where 条件来尽早过滤它们。但是,在 OR 的情况下,您不能先应用两者,因为这实际上是 AND。它可以尝试从两个方向开始并有效地执行标准的 UNION,但这可能说起来容易做起来难。
标签: mysql sql database performance