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】:

我会避免这两种方法。您应该能够通过明智地使用ANDORIS 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 子句中的 CASE

MySQL CASE WHEN where 子句导致失败

Where 子句 TSQL 中的 case 表达式

WHERE子句中的SQL Server CASE表达式以检查NULL值

Oracle SQL 不同的 where 子句与 case when

SQL:WHERE 子句中的 IF/CASE 语句