我有一个包含消息列表的 MySQL 表,其中每条消息都属于一个房间。我做这样的查询:
SELECT * FROM messages WHERE room='offtopic' ORDER BY id DESC LIMIT 5;
随着我的表增加到数十万条消息的数量,数据库变得有点慢。我添加了一个名为room
BTREE 的索引,它不是唯一的,不是填充的,列 room(5),现在基数为 425。
这对性能有帮助吗?阿卡我做得对吗?
我有一个包含消息列表的 MySQL 表,其中每条消息都属于一个房间。我做这样的查询:
SELECT * FROM messages WHERE room='offtopic' ORDER BY id DESC LIMIT 5;
随着我的表增加到数十万条消息的数量,数据库变得有点慢。我添加了一个名为room
BTREE 的索引,它不是唯一的,不是填充的,列 room(5),现在基数为 425。
这对性能有帮助吗?阿卡我做得对吗?
是的,对于那个特定的查询,几乎可以肯定这是一个好主意,不能说其他查询,因为你没有展示它们。
通过在room
列上添加索引,它应该能够在流程的早期更有效地折扣大部分表格,使用索引丢弃房间不是您想要的每一行。425 的基数(通常是估计值)意味着索引中有很多唯一值,因此它们成为您的起点(400 多行),而不是您提到的数十万行。
但基本思想是在类似生产的环境中运行查询以查看它们的执行情况(通过使用explain
),然后添加索引并再次尝试查看您获得了什么样的改进。
优化是没有衡量标准的傻事。我在这个主题上听过的最好的口头禅是“衡量,不要猜测”。