一尘不染

MySQL索引-多少就足够了?

mysql

我正在尝试微调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行?


阅读 307

收藏
2020-05-17

共1个答案

一尘不染

索引编制的数量和要做的过多事情取决于很多因素。在诸如“类别”表之类的小型表上,您通常不需要或不需要索引,这实际上会损害性能。原因是读取索引需要I /
O(即时间),然后检索与匹配的行关联的记录需要更多的I / O和时间。一个例外是仅查询索引中包含的列。

在您的示例中,您只检索22列的所有列,而仅进行表扫描并对它们进行排序而不是使用索引可能会更快。优化器可能正在/应该这样做并且忽略了索引。如果是这种情况,那么索引只是占用空间而没有任何好处。如果您经常访问“类别”表,则可能需要考虑将其固定到内存中,以便db服务器保持其可访问性,而不必一直访问磁盘。

添加索引时,您需要平衡磁盘空间,查询性能以及更新和插入表的性能。与每天有数百万次更新的表相比,您可以在静态且不变不大的表上获得更多索引。那时您将开始感觉到索引维护的影响。但是,在您的环境中可接受的是并且只能由您和您的组织确定。

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

2020-05-17