Google Cloud Spanner 是否支持索引 Intersection/Combination/Merge?
Does Google Cloud Spanner support Index Intersection/Combination/Merge?
对相关功能的解释:
Postgres (Index Combination), MySQL (Index Merge) & MongoDB (Index Intersection)有一个功能,DB在没有的时候使用多个单列索引(indexes)为在 where 子句中有多个列的给定查询找到的多列索引。这是 Postgres 的文档中关于此功能的内容 - https://www.postgresql.org/docs/8.3/indexes-bitmap-scans.html
摘自 link
Beginning in release 8.1, PostgreSQL has the ability to combine
multiple indexes (including multiple uses of the same index) to handle
cases that cannot be implemented by single index scans. The system can
form AND and OR conditions across several index scans. For example, a
query like WHERE x = 42 OR x = 47 OR x = 53 OR x = 99 could be broken
down into four separate scans of an index on x, each scan using one of
the query clauses. The results of these scans are then ORed together
to produce the result. Another example is that if we have separate
indexes on x and y, one possible implementation of a query like WHERE
x = 5 AND y = 6 is to use each index with the appropriate query clause
and then AND together the index results to identify the result rows.
我的用例:
我想构建一个 UI,用户可以在其中使用 table 中的多个字段(目前有 30 多个字段,并且还在增加)搜索(过滤)实体。 UI 中需要显示过滤实体的数量,并在用户对过滤器进行的每次更新时刷新。因此,它需要快速(最好 < 1s)是隐含的。为所有可能的组合创建多个列索引是不可行的,即使完成也可能效率低下。
以下是我通过 运行 一些查询观察到的结果。
Case 1:
select count(*) from TableName@{FORCE_INDEX=_BASE_TABLE} where stringColumn = 'str1';
Table Scan: TableName (full scan: true) ~11.72s
Case 2:
select count(*) from TableName where stringColumn = 'str1';
Index Scan: IndexForStringColumn 1.55s
Case 3:
select count(*) from TableName where ts > '2019-01-01';
Index Scan: IndexForTS 450902 1 985.66 ms
Case 4:
select count(*) from TableName where stringColumn = 'str1' and ts > '2019-01-01';
Index Scan: IndexForTS 450903 1 1.07 s
- 案例 1 到 3。符合预期。案例 1 没有使用任何索引,因此
TableScan 11.72s.
- 情况4是异常。它说它只使用
IndexForTS。但是运行时间似乎要短得多(1.07s)。看起来像
这也使用了 IndexForStringColumn。
问题:
- Google Cloud Spanner 是否支持为单个查询使用多个单列索引的功能?当我尝试 运行 Cloud Spanner 中的一些基准测试时,它 看起来 似乎受支持,但没有关于此的官方文档。
- 如果不支持,是否可以使用 Google Cloud spanner 构建此功能的任何其他方式?
在此先感谢您的帮助!
不幸的是,索引交集和并集在积压中。如果适用,Cloud Spanner 将选择一个索引,但范围仅限于单个索引。如果你有一个大的conjunct,将使用最具选择性的单列索引。
您始终可以通过重写 SQL 语句来制作索引交集和并集。例如,
SELECT * 从 X = 1 和 y = 1 的地方开始;
可以改写为
SELECT * FROM A WHERE key IN ((SELECT key FROM A WHERE x = 1) INTERSECT (SELECT key FROM A FROM y = 1));
同样,
SELECT * 从 A WHERE x = 1 OR y = 1;
可以改写为
SELECT * FROM A WHERE key IN ((SELECT key FROM A WHERE x = 1) UNION (SELECT key FROM A FROM y = 1)); -- 如果您不希望有大量行满足任一谓词,则可以添加 ALL。
希望对您有所帮助。
对相关功能的解释:
Postgres (Index Combination), MySQL (Index Merge) & MongoDB (Index Intersection)有一个功能,DB在没有的时候使用多个单列索引(indexes)为在 where 子句中有多个列的给定查询找到的多列索引。这是 Postgres 的文档中关于此功能的内容 - https://www.postgresql.org/docs/8.3/indexes-bitmap-scans.html
摘自 link
Beginning in release 8.1, PostgreSQL has the ability to combine multiple indexes (including multiple uses of the same index) to handle cases that cannot be implemented by single index scans. The system can form AND and OR conditions across several index scans. For example, a query like WHERE x = 42 OR x = 47 OR x = 53 OR x = 99 could be broken down into four separate scans of an index on x, each scan using one of the query clauses. The results of these scans are then ORed together to produce the result. Another example is that if we have separate indexes on x and y, one possible implementation of a query like WHERE x = 5 AND y = 6 is to use each index with the appropriate query clause and then AND together the index results to identify the result rows.
我的用例:
我想构建一个 UI,用户可以在其中使用 table 中的多个字段(目前有 30 多个字段,并且还在增加)搜索(过滤)实体。 UI 中需要显示过滤实体的数量,并在用户对过滤器进行的每次更新时刷新。因此,它需要快速(最好 < 1s)是隐含的。为所有可能的组合创建多个列索引是不可行的,即使完成也可能效率低下。
以下是我通过 运行 一些查询观察到的结果。
Case 1:
select count(*) from TableName@{FORCE_INDEX=_BASE_TABLE} where stringColumn = 'str1';
Table Scan: TableName (full scan: true) ~11.72s
Case 2:
select count(*) from TableName where stringColumn = 'str1';
Index Scan: IndexForStringColumn 1.55s
Case 3:
select count(*) from TableName where ts > '2019-01-01';
Index Scan: IndexForTS 450902 1 985.66 ms
Case 4:
select count(*) from TableName where stringColumn = 'str1' and ts > '2019-01-01';
Index Scan: IndexForTS 450903 1 1.07 s
- 案例 1 到 3。符合预期。案例 1 没有使用任何索引,因此 TableScan 11.72s.
- 情况4是异常。它说它只使用 IndexForTS。但是运行时间似乎要短得多(1.07s)。看起来像 这也使用了 IndexForStringColumn。
问题:
- Google Cloud Spanner 是否支持为单个查询使用多个单列索引的功能?当我尝试 运行 Cloud Spanner 中的一些基准测试时,它 看起来 似乎受支持,但没有关于此的官方文档。
- 如果不支持,是否可以使用 Google Cloud spanner 构建此功能的任何其他方式?
在此先感谢您的帮助!
不幸的是,索引交集和并集在积压中。如果适用,Cloud Spanner 将选择一个索引,但范围仅限于单个索引。如果你有一个大的conjunct,将使用最具选择性的单列索引。
您始终可以通过重写 SQL 语句来制作索引交集和并集。例如,
SELECT * 从 X = 1 和 y = 1 的地方开始;
可以改写为
SELECT * FROM A WHERE key IN ((SELECT key FROM A WHERE x = 1) INTERSECT (SELECT key FROM A FROM y = 1));
同样,
SELECT * 从 A WHERE x = 1 OR y = 1;
可以改写为
SELECT * FROM A WHERE key IN ((SELECT key FROM A WHERE x = 1) UNION (SELECT key FROM A FROM y = 1)); -- 如果您不希望有大量行满足任一谓词,则可以添加 ALL。
希望对您有所帮助。