【问题标题】:How to index a table for a query with "order by if"?如何使用“order by if”为查询索引表?
【发布时间】:2015-08-17 02:09:47
【问题描述】:

是否可以在下面有IF条件的查询中创建索引方便ORDER BY,如下?:

SELECT a, b, c, d, e 
FROM myTable 
ORDER BY IF(published, 0, 1), rank, title

我尝试在 myTable(published, rank, ti​​tle) 和 myTable(rank, ti​​tle) 上创建索引,但使用 EXPLAIN 测试查询显示没有使用索引。

"published" 是一个 tinyint,为 0 或 1; "rank" 也是一个 tinyint,但可以是该范围内的任何值; “标题”是 varchar(255)。

非常感谢(我正在使用从其他开发人员那里继承的代码...)

【问题讨论】:

    标签: mysql indexing sql-order-by


    【解决方案1】:

    在这个特定的示例中,查询似乎可以重写为:

    SELECT a, b, c, d, e 
    FROM myTable 
    ORDER BY published DESC, rank, title
    

    特别是,这不适用于任意转换函数,但可以在本例中使用。

    【讨论】:

      【解决方案2】:

      在 MySQL 中没有索引可以帮助这个查询。

      您可以做的一件事是将PublishedFlag 添加到表中。但是,这需要updateinset 的触发器。但是,然后这个查询:

      SELECT a, b, c, d, e 
      FROM myTable 
      ORDER BY PublsihedFlag, rank, title
      

      可以利用mytable(PublsihedFlag, rank, title) 上的索引。

      【讨论】:

      • 只有当 PublsihedFlag 的 smaller 值是你想要的 first 时才有效。
      • @RickJames。 . .如果你想要相反的顺序,你可以添加desc
      • 是的。但是它将无法使用索引。 ORDER BY 中的所有列必须具有相同的方向才能使这些列上的索引有用。
      • @RickJames。 . . desc 也可以添加到索引中。
      • 是的。但是 MySQL 忽略了它。
      猜你喜欢
      • 1970-01-01
      • 2017-03-30
      • 1970-01-01
      • 2019-06-20
      • 2020-11-19
      • 2013-02-11
      • 2014-12-27
      • 2014-03-27
      • 1970-01-01
      相关资源
      最近更新 更多