MySQL:制作3个字段的复合索引,或制作3个单独的索引?

时间:2010-11-16 14:04:20

标签: mysql indexing compound-index

我有一个MySQL表,除其他属性外,还有时间戳,类型和user_id 所有这些都是可搜索和/或可排序的 为每个索引创建一个索引,或者用这三个或两者创建一个复合索引是否更好?

2 个答案:

答案 0 :(得分:10)

巴勃罗的回答是正确的,但也许你不会意识到复合指数可能是合理的。

您可以拥有多个索引,idx1(tstamp, user_id)不会让您排除indx2(tstamp, type)idx1reverse(user_id, tstamp)等等...

复合索引在覆盖查询中的所有条件时最有用,因此您建议的索引对于

最有用
SELECT * FROM my_table WHERE tstamp = @ts1 AND user_id = @uid AND type = @type

如果要提高此类查询的性能,可以考虑添加复合索引。

索引的缺点是它会降低所有更新操作的速度。但是,大多数通用应用程序会执行更多选择然后更新(在事务方面,即语句数量,特别是在受影响/检索的记录方面),同时更容忍更慢的更新(用户主要判断速度)系统不是在需要更新记录时,而是在检索记录所需的时间;再次是YMMV,并且有些应用程序不遵守这些规则)。

最好的方法是,如果您有一些方法可以根据典型工作负载测试数据库性能(创建一些典型的SQL脚本;独立且可重复,或在应用程序级别创建单元测试),然后您可以客观地调整数据库

修改 还要意识到可以在不影响系统功能的情况下添加和删除索引。因此,您可以稍后在系统的实际使用期间调整索引 - 通常,您将收集并分析慢速SQL查询,以查找可能从添加索引中受益的条件。

答案 1 :(得分:9)

如果要分别对这些字段执行搜索,则可能需要单独的索引才能使查询运行得更快。

如果您有这样的索引:

mysql> create index my_idx on my_table(tstamp, user_id, type);

你的查询是:

mysql> select * from my_table where type = 'A';

然后my_idx对您的查询没有帮助,MySQL最终会进行全表扫描来解决它。