假设我们有一个表来存储用户最喜欢的图片,其中包含一个复合主键对(UserId,PictureId)。书中通常会说,在这种情况下,您需要一个基于(UserId,PictureId)的综合索引,它通常在WHERE子句中显示为(UserId=103和PictureId=1234)。但我认为数据库引擎应该足够智能,可以分别使用基于这两列的两个单独的索引。只需从每个索引中获取行号集合,并找到两个集合中都存在的行号。这样,综合指数就不再是必要的了。
那么,在现实中,数据库引擎能做到这一点吗?
发布于 2012-06-23 12:49:56
使用两个单独的单列索引没有好处;引擎最好是执行表扫描。
使用索引的目的是使访问速度更快。如果引擎使用两个索引,它将不得不对其中一个索引中的至少一组数据进行排序,并合并两个索引的结果。这将比只读取一个综合索引多得多的工作,特别是因为综合索引只允许索引扫描。
发布于 2012-06-23 13:45:35
大多数数据库引擎都需要复合索引来强制执行主键。因此,它是一个“免费”的索引,你无论如何都会有--为什么要担心它呢?
仅在PictureID上添加第二个索引可能会有一些好处(如果索引在UserID,PictureID上)。任何只针对UserID的查询都可以使用复合索引,而只使用PictureID的查询则无法使用复合索引。
发布于 2012-06-23 12:54:54
我认为在您描述的用例中,综合索引是不必要的。如果您正在查询一组给定的用户ID和一组给定的图片ID,那么这将非常有用。但是你什么时候需要它呢?你更有可能查询用户在给定日期范围内的所有图片,或者根据ID查找特定的图片。这将建议一个复合用户id +日期索引的索引结构,以及另一个图片id唯一的索引。
它始终取决于数据库中记录的分布情况,以及您将最频繁运行的查询类型。
https://stackoverflow.com/questions/11166889
复制相似问题