MySQL索引--多少足够?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (25)

我试图微调我的MySQL服务器,所以我检查我的设置,分析慢速查询日志,并在可能的情况下简化我的查询。

有时,如果我索引正确,有时就足够了。我在某个地方读过(如果这是愚蠢的话请纠正我),比我需要的更多的索引会产生同样的效果,就像我没有任何索引一样。

多少个索引足够了?你可以说这取决于数百个因素,但我很好奇我该如何清理我的mysql-slow.log足以减少服务器负载。

此外,我还看到了一些“有趣”的日志条目,如下所示:

# Query_time: 0  Lock_time: 0  Rows_sent: 22  Rows_examined: 44
SELECT * FROM `categories` ORDER BY `orderid` ASC;

所讨论的表正好包含22行,索引设置为orderid...。为什么这个查询会出现在日志中呢?如果它只包含22行,为什么要检查44行?

提问于
用户回答回答于

索引的数量和做得太多的行将取决于许多因素。在诸如“类别”表这样的小表上,通常不需要或不需要索引,这实际上会损害性能。原因是读取索引需要I/O(即时间),然后需要更多的I/O和检索与匹配行关联的记录的时间。只有查询索引中包含的列时才会出现异常。

正在检索所有列,并且只有22行,而不是使用索引,只进行表扫描和排序可能会更快。优化器可能/应该这样做,而忽略索引。如果是这样的话,那么指数只是占用空间而没有任何好处。如果你的“类别”表经常被访问,可能需要考虑将它固定在内存中,这样db服务器就可以随时访问它,而不必一直转到磁盘。

在添加索引时,需要平衡磁盘空间、查询性能以及更新和插入表的性能。可以使用更多的静态表索引,而不是每天更新数百万次的表。此时,将开始感受到索引维护的影响。但是,在你的环境中,什么是可以接受的,这是并且只能由你来决定。

在进行分析时,一定要生成/更新表和索引统计信息,以便确保计算准确。

用户回答回答于

作为一般规则,应该对所有主键(在这方面没有选择)、所有外键和其他你通常用于获取行的字段都有索引。

例如,如果我通常使用用户名查找用户,那么即使用户ID是主键,我也会对其进行索引。

扫码关注云+社区