查询性能 - 脑筋急转弯
Query performance - Brain teaser
考虑 table 有 2 列,
- column_1 有 60% 的不同值,column_2 有 40% 的不同值
值。
- 两者具有相同的数据类型,例如整数
如果要在这个table上应用索引,他应该选择索引哪一列?为什么?
创建索引最重要的考虑因素是,如果您对该字段执行搜索,那么数据类型是无关紧要的。
现在,虽然更多不同的值更有效,但索引是因为您可以更快地丢弃行。如果大多数行相同,则索引将与 FULL SCAN
相同
因此,如果您有类似
的查询
SELECT * FROM Table WHERE fieldA = Value;
SELECT * FROM Table WHERE fieldB = Value;
你想要两个索引,每个字段一个
但是如果你有这样的问题
SELECT * FROM Table WHERE fieldA = Value
AND fieldB = Value;
您想要包含两个字段 (fieldA, fieldB) 的复合索引
最后一个提示是,如果您希望 return 在您的 select
上使用单个值
SELECT fieldB FROM Table WHERE fieldA = Value;
您还需要一个复合索引,因为您将在索引中搜索 Value 而不必在 table 上进行查找以获得 fieldB
的值,因为 已经在索引中.
考虑 table 有 2 列,
- column_1 有 60% 的不同值,column_2 有 40% 的不同值 值。
- 两者具有相同的数据类型,例如整数
如果要在这个table上应用索引,他应该选择索引哪一列?为什么?
创建索引最重要的考虑因素是,如果您对该字段执行搜索,那么数据类型是无关紧要的。
现在,虽然更多不同的值更有效,但索引是因为您可以更快地丢弃行。如果大多数行相同,则索引将与 FULL SCAN
因此,如果您有类似
的查询 SELECT * FROM Table WHERE fieldA = Value;
SELECT * FROM Table WHERE fieldB = Value;
你想要两个索引,每个字段一个
但是如果你有这样的问题
SELECT * FROM Table WHERE fieldA = Value
AND fieldB = Value;
您想要包含两个字段 (fieldA, fieldB) 的复合索引
最后一个提示是,如果您希望 return 在您的 select
上使用单个值 SELECT fieldB FROM Table WHERE fieldA = Value;
您还需要一个复合索引,因为您将在索引中搜索 Value 而不必在 table 上进行查找以获得 fieldB
的值,因为 已经在索引中.