我在SQL Server中有一个看起来像这样的查询:
SELECT m.id
FROM Message m
WHERE m.id IN (someIds)
AND m.creationTime >= someDate
AND m.partition_number IN (0,1)
我的问题是哪种索引最适合这种情况。非常感谢。
答案 0 :(得分:1)
我将假设id是Message表中的主键(如果不是,那么你会让很多人在访问你的代码时遇到问题)。< / p>
PK将是一个聚集索引:也就是说,它不与索引指向的数据分开。找到密钥,与之关联的数据随之存储。对于非聚集索引(例如可能存在于creationTime上),与密钥一起存储的是指向数据的指针,然后服务器必须离开并进行另一次磁盘访问以读取数据。因此,聚簇索引比非聚簇索引更有效,因为您只需要找到密钥。
如果您可以指定PK值(查询中的someIds),它将尽可能高效,并且在creationTime上添加索引不会改进它。实际上,如果SQL Server和PK一样使用它,那么它会降低查询质量。
所以只要id是你正在尽可能做的PK。
最终评论:您正在做的事情称为过早优化,通常是禁止的。对于数据库,在您知道有问题并且可以测量它之前,不要太努力提高性能。然后你得到查询的查询计划,这个计划很慢并开始玩它。在此之前,了解您的应用程序发出的查询将为您提供所需索引的非常好的第一近似值,在您知道存在问题之前,您不应该过于努力地优化它们。