【问题标题】:CASE or COALESCE performance in WHERE clause for MySQLMySQL 的 WHERE 子句中的 CASE 或 COALESCE 性能
【发布时间】: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 查询计划,它看起来不会有太大不同

标签: mysql sql performance null case


【解决方案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。
    猜你喜欢
    • 2014-06-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-08
    • 1970-01-01
    • 1970-01-01
    • 2020-03-26
    • 2017-04-01
    相关资源
    最近更新 更多