mysql - 将 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
这会立即完成,但是查询似乎很愚蠢,必须有更好的方法来做到这一点。
我应该在这里使用什么?
解决方案
根据我的经验,使用功能(例如 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')
推荐阅读
- php - 使用 PHP 库进行 FFMPEG 音频合并
- ios - 在 Firestore 中保存数组并在 Swift 的 uitableview 中显示它
- python - 用于 Intel Hex 的 8 位行校验和计算器
- angular - 如何使用 Angular 9 和 NGRX 在子组件中获取数据?
- python - 我想提取 h4 中的文本以及与 h4 相关的文本以及与它们相关的链接(使用 xpath)
- php - 根据 Apache 日志文件,Wordpress 出现黑客攻击(后门 PHP 特洛伊木马)和服务器被用作对抗他人的机器人
- odoo-11 - Qweb 报告中布尔字段的条件 - Odoo11
- game-maker-studio-2 - 如何确保玩家移动并播放动作动画后,机架的动画(空闲)
- python - 在 Pymoo 优化中提供约束
- c# - 使用取消令牌停止 Parallel.ForEach 并停止