2010-11-16 179 views

回答

8

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

你可以有多个指标,并具有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查询,以查找可从添加索引中受益的条件。

7

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

如果你有一个这样的指标:

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

你查询的是:

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

然后my_idx不会为你的查询有帮助和MySQL最终会做一个完整的表扫描来解决它。

+0

...并且对于诸如'select * from my_table where tstamp = @ ts1'这样的查询仍然有帮助。 – Unreason 2010-11-16 14:40:55

+0

是的,它可能有助于查询。但是不会像那个专栏上的仅索引**那样有帮助。 – 2010-11-16 15:02:43

+3

是的,实际上它只会像索引那样有帮助。由于指数较大这一事实可能会较慢 - 但是,如果单列的指数是有用的(即,高选择性),那么复合索引将是有用的 - mysql可能会查看更大的索引,但btree索引被组织为树,所以增加大小,加上仅需要访问树的一部分的事实,再加上I/O操作发生在块大小的事实转化为:具有相同起始列的索引对该列的条件同样有帮助。 – Unreason 2010-11-16 15:22:35

相关问题