0

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

4

3 回答 3

0

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

于 2013-02-11T13:15:21.643 回答
0

如果你可以定义一个唯一的主键,在查询表时可以使用,这将用作聚集索引,并且将是最快的选择。

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

于 2013-02-11T13:35:36.340 回答
0

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

考虑到这一点,除非它对您的应用程序具有业务意义,否则您可能不会从主键 (ID) 上的聚集索引中看到太多好处。如果您有一个经常查询的日期值,那么向该值添加聚集索引可能更有意义

select * from table where created > '2013-01-01' and created < '2013-02-01'

我见过数据仓库使用连接键的方法。这是否适合您取决于您​​的查询。显然查询单个字段值会比查询多个字段更快,尤其是在 B-tree 索引中查找的次数较少时。

或者,如果您在一个表中有 2 亿行,您可以考虑将数据拆分为多个表(如果这样做有意义的话)。

你是说你每个月都会加载所有这些数据,所以我必须假设所有数据都是相关的。如果您的表中存在被认为“旧”且与搜索无关的数据,那么您可以将数据移出存档表(使用相同的架构),以便您的查询仅针对“当前”数据运行。

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

于 2013-02-11T13:39:28.440 回答