MySQL 小数列 ORDER BY 查询的索引

MySQL Index for Decimal Column ORDER BY Query

我有一个 table 'posts' 列 'hot' (reddit 算法)。 'hot' 是小数:XXXXX,XXXXXXX

这是我的查询:

SELECT * FROM posts ORDER BY hot DESC

现在我希望此查询使用 'hot' 的索引。我试过了

ADD INDEX hot_index(hot)

和 SHOW INDEXES FROM posts 告诉我确实创建了索引。

但是,当我 运行 我的查询前面有 'EXPLAIN' 时,我可以看到 MySQL 没有使用索引进行排序。为什么?我该如何更改?

非常感谢!

显然 MySQL 决定按顺序读取整个 table 并即时执行排序比读取索引(因此具有排序顺序)更快,但是然后必须一条一条地访问帖子记录。这是一个有效的假设。

如果这会导致性能问题,那么您可能需要覆盖索引,从排序列开始:

create index idx on posts(hot, col1, col2, col3 ...)

对于 select *,您必须在该索引中包含所有列。

使用覆盖索引,DBMS 可以从索引本身获取所有值,因此不必再访问 table。

无论如何,DBMS 仍然有可能更喜欢按顺序读取 table,但很可能不会。

还有一点就是你排序是降序的,但是索引是升序的。当涉及排序时,我会尝试使索引与排序顺序完全匹配:

create index idx on posts(hot desc, ...)