20

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

4

2 回答 2

15

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

如果你有这样的索引:

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

你的查询是:

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

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

于 2010-11-16T14:07:21.257 回答
10

Pablo 的回答是正确的,但也许您不会意识到复合索引可能是合理的。

您可以拥有多个索引,并且 haveidx1(tstamp, user_id)并不排除您拥有indx2(tstamp, type)oridx1reverse(user_id, tstamp)等​​等......

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

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

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

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

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

编辑 还意识到可以添加和删除索引而不影响系统的功能。因此,您可以稍后在实际使用系统期间调整索引 - 通常您会收集和分析缓慢的 SQL 查询,以寻找可以从添加索引中受益的条件。

于 2010-11-16T14:53:37.707 回答