【问题标题】:Checking index key used by rank() function in sql检查sql中rank()函数使用的索引键
【发布时间】:2020-08-07 07:48:30
【问题描述】:

使用EXPLAIN SELECT * FROM table1 where condition1 = condition1 and condition2 = condition2,您可以检查正在使用的索引键(如果有的话)。

如果你有 SELECT * RANK() OVER (ORDER BY condition3 DESC, condition4 ASC) AS table2 FROM table1 ,你能索引 rank() 函数的 condition3 和 condition4 吗?哎呀,如果你已经完成了索引,你甚至如何检查 rank() 函数使用的索引?

【问题讨论】:

    标签: mysql database indexing ranking


    【解决方案1】:

    您的两个问题的答案都是肯定的,您的排名查询应该受益于以下索引:

    CREATE INDEX idx ON table1 (condition3 DESC, condition4);
    

    在上述查询上运行 EXPLAIN 应该会显示正在使用该索引。

    【讨论】:

    • 对,您的解决方案有效。因为以前我在做 SELECT * RANK() OVER (ORDER BY condition3 DESC, condition4 ASC) AS table2 FROM table1 WHERE condition1 = true 并且我有两个索引 key ,一个在条件 3 和 4 上,另一个在条件 1 上。在此运行 EXPLAIN 只给我条件 1 上的索引。如果我从语句中删除 WHERE condition1 = true,那么它会给我条件 3 和 4 的索引。知道为什么吗?
    • @tnkh 当您添加 WHERE 子句时,MySQL 可能无法使用我答案中的前一个索引。相反,请尝试使用(condition1, condition3 DESC, condition4)。一般来说,如果索引不能覆盖整个查询,那么数据库可能不会使用它。
    • @TimBiegeleisen - 混合方向(DESC 和 ASC)仅在运行 MySQL 8.0 并且有匹配方向的 INDEX 时才有效。 (或者有什么我不知道的魔法?)
    • @RickJames 在这种情况下,您建议的索引是什么?考虑到使用RANK,这里可以假设 MySQL 8+。
    • @TimBiegeleisen - Touche;显然是8.0。首先,我想试验一下是否在该上下文中实际使用了任何索引。 (我在窗口化和 CTE 方面的经验是,性能接近于“糟糕”。)如果你碰巧有一个完整的测试用例,那可能会让我走得更快。
    猜你喜欢
    • 2017-07-25
    • 2016-10-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多