【发布时间】:2013-02-11 13:13:49
【问题描述】:
应该在表上使用哪种类型的索引?它最初被插入(每月一个)到一个空表中。然后,我在其中两列上放置一个非聚集复合索引。想知道将这两个字段合并为一个字段是否会提高搜索时的性能。还是没关系?我应该使用具有主键聚集索引的标识列吗?
【问题讨论】:
标签: sql
应该在表上使用哪种类型的索引?它最初被插入(每月一个)到一个空表中。然后,我在其中两列上放置一个非聚集复合索引。想知道将这两个字段合并为一个字段是否会提高搜索时的性能。还是没关系?我应该使用具有主键聚集索引的标识列吗?
【问题讨论】:
标签: sql
当人们查询表时,您应该索引最有可能在 where 子句中使用的字段。不用担心主键 - 它已经有一个索引。
【讨论】:
如果你可以定义一个唯一的主键,可以在查询表时使用,这将用作聚集索引,并且对于选择来说是最快的。
如果您的选择查询必须使用您提到的两个字段,请将它们分开。性能不会受到影响,架构也不会被破坏。
【讨论】:
“聚集索引在经常搜索值范围的列上特别有效。在使用聚集索引找到具有第一个值的行之后,具有后续索引值的行保证物理上相邻。 "
考虑到这一点,除非它对您的应用程序具有业务意义,否则您可能不会从主键 (ID) 上的聚集索引中看到太多好处。如果您有一个经常查询的 Date 值,那么向该值添加聚集索引可能更有意义
select * from table where created > '2013-01-01' and created < '2013-02-01'
我已经看到数据仓库使用串联密钥方法。这是否适合您取决于您的查询。显然查询单个字段值会比查询多个字段更快,尤其是在 B-tree 索引中查找的次数较少时。
或者,如果您的表中有 2 亿行,您可以考虑将数据拆分为多个表,如果这样做有意义的话。
您是说您每个月都会加载所有这些数据,所以我必须假设所有数据都是相关的。如果您的表中存在被视为“旧”且与搜索无关的数据,那么您可以将数据移出存档表(使用相同的架构),以便您的查询仅针对“当前”数据运行。
否则,您可以查看 NoSQL(如 MongoDB)使用的 分片 方法。如果 MongoDB 不是一个选项,您可以在应用程序中实现与逻辑相同的分片键。我怀疑您的数据库 SQL 驱动程序是否会原生支持分片。
【讨论】: