【问题标题】:MySQL Index for Decimal Column ORDER BY Query小数列 ORDER BY 查询的 MySQL 索引
【发布时间】:2017-12-16 22:23:33
【问题描述】:

我有一个表“posts”,其中有一列“hot”(reddit 算法)。 'hot' 是小数:XXXXXX,XXXXXXX

这是我的查询:

SELECT * FROM posts ORDER BY hot DESC

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

ADD INDEX hot_index(hot)

并且 SHOW INDEXES FROM posts 显示索引确实已创建。

但是,当我在查询之前使用“EXPLAIN”运行查询时,我可以看到 MySQL 没有使用索引进行排序。为什么?我该如何改变呢?

非常感谢!

【问题讨论】:

  • 您可以尝试通过USE INDEX (hot_index) 进行查询SELECT * FROM posts USE INDEX (hot_index) ORDER BY hot DESC 进行索引提示,但也许MYSQL 已经将您的索引打折,因为没有真正的帮助
  • 是的,不幸的是这并没有帮助。我也尝试使用 INT 而不是小数,但这也不会改变任何东西。
  • 如果“SELECT * FROM posts ORDER BY hot DESC”是正在使用的查询,那么您需要表中的所有行,优化器会忽略它,因为它是全表扫描。正如 RiggsFolly 建议的那样,如果您确实想使用索引,可以尝试在查询中使用 USE INDEX 或 FORCE INDEX 提示。
  • 使用 FORCE INDEX 提示。如果仍然没有使用索引,则在热列上放置 where 子句,如果仍然没有拾取索引,则运行 OPTIMIZE/ANALYZE table 命令并检查。
  • 但是索引小数很奇怪,不是吗?因为一个十进制值涉及这么多的小数组合,所以想象所有的 0,00001、0,00002 或 0,00200 等。直到字段的全范围组合作为键......看起来没有真正的用处吗?跨度>

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


【解决方案1】:

显然,MySQL 认为顺序读取整个表并即时执行排序比读取索引(因此具有排序顺序)更快,但随后必须逐个访问帖子记录.这是一个有效的假设。

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

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

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

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

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

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

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

【讨论】:

  • 谢谢!我想我不需要覆盖索引,但很高兴知道:) 我会让 MySQL 决定是否使用它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-27
  • 2013-02-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多