我有一张桌子'帖子'一栏#热;' (reddit算法)。 '热'是十进制:XXXXX,XXXXXXX
这是我的疑问:
SELECT * FROM posts ORDER BY hot DESC
现在我希望此查询使用“热”的索引。我试过了
ADD INDEX hot_index(hot)
和SHOW INDEXES FROM帖子向我显示索引确实已创建。
但是,当我用' EXPLAIN'运行我的查询时在它之前,我可以看到MySQL没有使用索引进行排序。为什么?我怎么能改变它?
非常感谢!
答案 0 :(得分:2)
显然MySQL决定按顺序读取整个表并快速执行排序而不是读取索引(因此具有排序顺序)更快,但随后必须逐个访问帖子记录。这是一个有效的假设。
如果这会导致性能问题,那么您可能需要覆盖索引,从排序列开始:
create index idx on posts(hot, col1, col2, col3 ...)
使用select *
,您必须在该索引中包含所有列。
使用覆盖索引,DBMS可以从索引本身获取所有值,因此不再需要访问该表。
无论如何,DBMS仍然可能会顺序读取表格,但很可能不会这样做。
另一点是您按降序排序,但索引是升序。当它关于排序时,我会尝试使索引与排序顺序完全匹配:
create index idx on posts(hot desc, ...)