【问题标题】:Does sorting by IS NULL use an index in MySQL按 IS NULL 排序是否使用 MySQL 中的索引
【发布时间】:2020-11-10 00:49:52
【问题描述】:

以下查询(特别是 ORDER BY price IS NULL DESC)是否使用价格列上的索引?

SELECT * FROM products ORDER BY price IS NULL DESC, price DESC

product_id | price
-----------|------
1           5
2           6
3           NULL
4           8

我希望查询返回

product_id | price
-----------|------
3           NULL
4           8
2           6
1           5

【问题讨论】:

  • 使用EXPLAIN查看使用了哪些索引。
  • 据我所知,这导致查询使用文件排序....想要验证我的发现
  • 我不会感到惊讶。
  • 我不希望将ORDER BY price DESC 更改为ORDER BY price IS NULL DESC, price DESC 会改变是否使用索引。 “使用文件排序”并不意味着不使用索引。如果您需要知情的答案,请在您的问题中添加两个查询的解释

标签: mysql indexing sql-order-by


【解决方案1】:

你不是纯粹的“按IS NULL排序”;你有一个复合(多列)索引。

ORDER BY 过于复杂,无法避免“排序”。 (注意:'filesort' 不一定涉及到 'file',这个例子很可能在 RAM 中完成所有工作。)

处理过程如下:

  • 收集 3 列:product_id, price, (price IS NULL)
  • 请注意,price IS NULL 必须被评估,得到 0(非空)或 1(空)
  • 将 0/1 与价格逻辑组合,形成 2 列的列对来驱动排序
  • 排序
  • 交付结果。

如果您简单地说ORDER BY price DESC,则可以使用INDEX(price) ,但它会将NULLs 排在最后。 (我说“可以”是因为“文件排序”可能比在索引的 BTree 和数据之间跳转更快。)

警告:您可能已经“简化”了问题的查询。作为回应,我已经解决了您的简化查询。我提供了一些提示,这些提示可能适用于“一般情况”,也可能不适用。

【讨论】:

    猜你喜欢
    • 2011-10-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-11
    • 2014-12-21
    • 1970-01-01
    • 2023-04-03
    • 1970-01-01
    相关资源
    最近更新 更多