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, ...)
我有一个 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, ...)