首页 > 解决方案 > 将 WHERE 与 COALESCE 一起使用非常慢

问题描述

我有以下查询,运行大约需要一分钟:

SELECT * FROM main_i i JOIN main_p p ON p.item_id=i.id
WHERE COALESCE(p.provider_title_id, i.provider_title_id) = "X"

虽然这看起来是一个非常简单的查询,但它需要很长时间才能运行,而我能够解决它的唯一方法是使用以下方法:

SELECT * FROM main_i i JOIN main_p p ON p.item_id=i.id
WHERE p.provider_title_id = "X"
UNION
SELECT * FROM main_i i JOIN main_p p ON p.item_id=i.id
WHERE i.provider_title_id = "X" AND p.provider_title_id IS NULL

这会立即完成,但是查询似乎很愚蠢,必须有更好的方法来做到这一点。

我应该在这里使用什么?

标签: mysqlsql

解决方案


根据我的经验,使用功能(例如 COALESCE)会停止数据库引擎以预先优化行选择。数据库引擎在运行通过此类函数连接表产生的每条记录之前,不确定最终结果。相反,在您的第二个查询中,数据库引擎确切地知道在创建初始集时要过滤什么(在应用 where 之前)。您也许可以在查询解释计划中选择它。

如您所知,实现相同结果的另一种方法如下。这应该运行得更快,在某种程度上证明了事实..

SELECT *
FROM main_i i JOIN
     main_p p
     ON p.item_id = i.id
WHERE p.provider_title_id = 'X'
OR
(p.provider_title_id IS NULL 
AND i.provider_title_id = 'X')

推荐阅读