在具有超过2百万行的表中搜索记录

时间:2013-02-11 13:13:49

标签: sql

桌子上应该使用哪种类型的索引?它最初插入(每月一个)到一个空表。然后,我在两个列上放置一个非聚集的复合索引。想知道将两个字段合并为一个会在搜索时提高性能。或者没关系?我应该使用具有主键聚簇索引的标识列吗?

3 个答案:

答案 0 :(得分:0)

当人们查询表时,您应该将最有可能在where子句中使用的字段编入索引。不要担心主键 - 它已经有一个索引。

答案 1 :(得分:0)

如果您可以定义在查询表时可以使用的唯一主键,则它将用作聚簇索引,并且对于选择将是最快的。

如果您的选择查询必须使用您提到的两个字段,请将它们分开。性能不会受到影响,架构也不会被破坏。

答案 2 :(得分:0)

"聚簇索引在经常搜索值范围的列上特别有效。在使用聚簇索引找到具有第一个值的行之后,保证具有后续索引值的行在物理上相邻。"

考虑到这一点,除非对您的应用程序具有商业含义,否则您可能无法从主键(ID)上获得聚集索引获益。如果您有一个通常查询的Date值,那么将聚簇索引添加到该值

可能更有意义
select * from table where created > '2013-01-01' and created < '2013-02-01'

我见过数据仓库使用连锁密钥方法。这是否适合您取决于您​​的查询。显然,查询单个字段值将比多个字段更快,特别是当B树索引中的查找次数减少时。

或者,如果表中有2亿行,如果有意义,可以将数据分成多个表。

您说您每月都会加载所有这些数据,所以我必须假设所有数据都是相关的。如果您的表格中有数据被视为&#34; old&#34;并且与搜索无关,那么您可以将数据移出到存档表中(使用相同的模式),这样您的查询只会针对&#34; current&#34;数据

否则,您可以查看NoSQL(如MongoDB)使用的分片方法。如果MongoDB不是一个选项,您可以在应用程序中实现与逻辑相同的分片键。我怀疑你的数据库SQL驱动程序本身是否支持分片。