用于十进制列的MySQL索引ORDER BY查询

时间:2017-07-12 13:07:18

标签: mysql performance indexing sql-order-by database-indexes

我有一张桌子'帖子'一栏#热;' (reddit算法)。 '热'是十进制:XXXXX,XXXXXXX

这是我的疑问:

SELECT * FROM posts ORDER BY hot DESC

现在我希望此查询使用“热”的索引。我试过了

ADD INDEX hot_index(hot)

和SHOW INDEXES FROM帖子向我显示索引确实已创建。

但是,当我用' EXPLAIN'运行我的查询时在它之前,我可以看到MySQL没有使用索引进行排序。为什么?我怎么能改变它?

非常感谢!

1 个答案:

答案 0 :(得分:2)

显然MySQL决定按顺序读取整个表并快速执行排序而不是读取索引(因此具有排序顺序)更快,但随后必须逐个访问帖子记录。这是一个有效的假设。

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

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

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

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

无论如何,DBMS仍然可能会顺序读取表格,但很可能不会这样做。

另一点是您按降序排序,但索引是升序。当它关于排序时,我会尝试使索引与排序顺序完全匹配:

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