MySQL 的 WHERE 子句中的 CASE 或 COALESCE 性能
Posted
技术标签:
【中文标题】MySQL 的 WHERE 子句中的 CASE 或 COALESCE 性能【英文标题】:CASE or COALESCE performance in WHERE clause for MySQL 【发布时间】:2012-05-09 16:31:14 【问题描述】:我想知道在处理 WHERE 子句中的多个条件和 NULL 值时,哪个是更好的性能或最佳实践。
WHERE
u.id = COALESCE(user_id, u.id) AND
su.custom_id = COALESCE(student_number, su.custom_id)
或
WHERE
CASE
WHEN user_id IS NOT NULL AND LENGTH(user_id) > 0
THEN
u.id = user_id
ELSE
su.custom_id = student_number
END
【问题讨论】:
你测试它的结果是什么?查询计划有何不同? 我是一名 SQL Server 人员,因此我对 mysql 的设置方式或类型的 Profiler 的了解有限。 尝试将 EXPLAIN EXTENDED 放在 Select 语句之前。如果您习惯于查看 SQL Server 查询计划,它看起来不会有太大不同 【参考方案1】:我会避免这两种方法。您应该能够通过明智地使用AND
、OR
、IS NULL
和括号来完成您想要做的事情。
例如,你可以重写这个:
WHERE
u.id = COALESCE(user_id, u.id) AND
su.custom_id = COALESCE(student_number, su.custom_id)
像这样:
WHERE
(user_id IS NULL OR u.id = user_id) AND
(su.custom_id = student_number)
你可以重写这个:
WHERE
CASE
WHEN user_id IS NOT NULL AND LENGTH(user_id) > 0
THEN
u.id = user_id
ELSE
su.custom_id = student_number
END
这样:
WHERE
(user_id IS NOT NULL AND LENGTH(user_id) > 0 AND u.id = user_id)
OR
(su.custom_id = student_number)
【讨论】:
【参考方案2】:我建议使用explain 并查看您的查询计划如何。喜欢:
explain <your select query here>
【讨论】:
您使用的是哪个版本的工作台?原因似乎存在一个错误,由于该错误解释未在工作台中显示任何 o/p;在 Workbench5.2.38 中得到了修复。看这里,dev.mysql.com/doc/workbench/en/wb-news-5-2-38.html 5.2.37 是我目前的版本。 好吧,那么根据文档,这是 Mysql Workbench 的一个错误。您需要升级到 5.2.38。以上是关于MySQL 的 WHERE 子句中的 CASE 或 COALESCE 性能的主要内容,如果未能解决你的问题,请参考以下文章
WHERE子句中的SQL Server CASE表达式以检查NULL值