【发布时间】:2018-10-26 04:48:06
【问题描述】:
我有下表:
CREATE TABLE Test (
device varchar(12),
pin varchar(4),
authToken varchar(32),
Primary Key (device)
);
在应用程序的不同点,我需要通过不同的 single 列子句查询此表。这意味着我有以下疑问:
SELECT * FROM Test WHERE device = ?;
SELECT * FROM Test WHERE authToken = ?;
SELECT * FROM Test WHERE pin = ?;
据我了解,在这种情况下,(device, authToken, pin) 的组合索引没有意义,因为这只会加速第一个查询,而不是第二个或第三个查询。
对于这个表来说,读取速度比写入更重要,那么简单地单独索引每一列是不是这里的最佳解决方案?
【问题讨论】:
-
是的,您需要三个单独的单列索引。嗯,第一个(
device)已经包含在主键中,所以你只需要两个额外的。 -
“阅读”与写作相比有多重要?因为您甚至可以实现覆盖索引,如果您希望查询速度很快。也就是说,通过使用二级索引并避免主索引。我假设你的表是 InnoDB 表,对吗?
-
@TheImpaler 是的,将使用 InnoDB。 “覆盖索引”是所有列的组合索引还是每个列的单独索引?
-
覆盖索引包括查询引用的所有列。因此它不是单列索引;它从“过滤列”(WHERE 中的列)开始,然后包括其余部分:简而言之,选择非常快,但插入/删除/更新成本很高。此外,您有三个查询,每个查询都需要一个单独的覆盖索引;也就是说,此解决方案将以修改操作为代价使您的选择非常快。仅当您需要高选择速度时才使用它。