【问题标题】:Am I doing indexes for my MySQL table right?我在为我的 MySQL 表做索引吗?
【发布时间】:2013-05-05 06:30:35
【问题描述】:

我有一个包含消息列表的 MySQL 表,其中每条消息都属于一个房间。我做这样的查询:

SELECT * FROM messages WHERE room='offtopic' ORDER BY id DESC LIMIT 5;

随着我的表增加到数十万条消息的数量,数据库变得有点慢。我添加了一个名为room 的索引,BTREE,不是唯一的,不是填充的,列室(5),现在基数为 425。

这对性能有帮助吗?阿卡我做得对吗?

【问题讨论】:

  • 在这种情况下,房间和 id 的索引就足够了。使用EXPLAIN 查看将在查询中使用哪些索引。 (如果您已经添加了索引,那么查询是否仍然很慢?如果是,特定查询和结果集大小的 EXPLAIN 是什么?)

标签: mysql indexing database-performance


【解决方案1】:

是的,对于 特定查询几乎可以肯定是一个好主意,不能说其他查询,因为您没有显示它们。

通过在room 列上添加索引,它应该能够在流程的早期更有效地折扣大部分表格,使用索引丢弃房间不是你想要的每一行.基数 425(通常是估计值)意味着索引中有许多唯一值,因此它们成为您的起点(400 多行),而不是您提到的数十万行。

但基本思想是在类似生产的环境中运行查询以查看它们的执行情况(通过使用explain),然后添加索引并再次尝试查看有哪些改进你明白了。

优化是没有衡量标准的傻事。我在这个主题上听过的最好的口头禅是“衡量,不要猜测”。

【讨论】:

  • 我删除了索引,查询执行得更快了??
  • @gladoscc,那么这需要调查。这是衡量而不是猜测的有用效果。您可能会发现这只是一个简单的异常,但您应该调查一下,包括在需要时提出另一个问题。
猜你喜欢
  • 1970-01-01
  • 2017-07-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-27
  • 2015-01-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多