首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >MySQL索引--多少个就足够了?

MySQL索引--多少个就足够了?
EN

Stack Overflow用户
提问于 2009-08-14 13:34:16
回答 4查看 11K关注 0票数 15

我正在尝试微调我的MySQL服务器,以便我检查我的设置,分析慢查询日志,如果可能的话,简化我的查询。

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

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

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

代码语言:javascript
复制
# Query_time: 0  Lock_time: 0  Rows_sent: 22  Rows_examined: 44
SELECT * FROM `categories` ORDER BY `orderid` ASC;

有问题的表恰好包含22行,索引设置为orderid。为什么这个查询会出现在日志中呢?如果只包含22行,为什么还要检查44行?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2009-08-14 13:55:31

索引的数量和做得太多的线将取决于许多因素。在像“类别”表这样的小型表中,您通常不想要或不需要索引,这实际上会影响性能。原因是读取索引需要I/O (即时间),然后需要更多的I/O和时间来检索与匹配的行相关联的记录。一个例外情况是,您只查询索引中包含的列。

在您的示例中,您将检索所有列,并且只有22行,如果只进行一次表扫描并对这些列进行排序,而不是使用索引,可能会更快。优化器可能/应该这样做,并忽略索引。如果是这种情况,那么索引只会占用空间而没有任何好处。如果你的"categories“表经常被访问,你可能会考虑把它固定在内存中,这样db服务器就可以让它保持可访问性,而不必一直访问磁盘。

在添加索引时,您需要平衡磁盘空间、查询性能以及更新和插入表的性能。与每天有数百万次更新的表相比,您可以在静态且不会发生太多更改的表上使用更多索引。从那时起,您将开始感受到索引维护的影响。但是,在您的环境中什么是可接受的,并且只能由您和您的组织决定。

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

票数 22
EN

Stack Overflow用户

发布于 2009-08-14 13:39:30

作为一般规则,您应该在所有主键(您在这方面没有选择)、所有外键以及您经常用来获取行的任何其他字段上都有索引。

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

票数 13
EN

Stack Overflow用户

发布于 2009-08-14 13:44:29

索引可以加快SELECT查询的速度,但会降低INSERT/ update /DELETE查询的速度,因为它们还需要更新索引,而不仅仅是行。

这只是我个人的观点(我没有任何事实支持它),但是我认为,如果有一个查询需要很长时间,而索引会加速它,那就去做吧!“太多”的索引将是如果你添加的索引没有任何好处(例如,没有查询,它会加速)。例如,一件愚蠢的事情就是“仅仅因为”在每一列上放置一个索引。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1277865

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档