当前位置: 首页 > 知识库问答 >
问题:

谷歌云扳手支持索引交叉/组合/合并吗?

况弘新
2023-03-14

有关所述功能的说明:

Postgres(索引组合)、MySQL(索引合并)和MongoDB(索引交叉)有一个功能,当在where子句中有多列的给定查询没有找到多列索引时,DB使用多个单列索引(索引)。以下是Postgres的文档对此特性的说明--https://www.costgreql.org/docs/8.3/indexes-bitmap-scans.html

链接节选

从8.1版开始,PostgreSQL有能力组合多个索引(包括同一索引的多次使用),以处理单个索引扫描无法实现的情况。系统可以跨几次索引扫描形成AND和OR条件。例如,可以将x=42或x=47或x=53或x=99这样的查询分解为对x上的索引的四次单独扫描,每次扫描都使用一个查询子句。然后将这些扫描的结果一起进行“或”运算,以产生结果。另一个例子是,如果我们在x和y上有单独的索引,那么查询的一个可能实现就是使用每个索引和适当的查询子句,然后将索引结果一起标识结果行。

我的用例:

我想构建一个用户可以使用表中的多个字段(当前和正在增长的字段有30+个)搜索(筛选)实体的UI。过滤实体的数量将需要显示在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没有使用任何索引,因此没有使用11.72s的表扫描。
  • 例4为异常。它说它只使用了索引堡。但运行时似乎要低得多(1.07s)。似乎也使用了IndexForStringColumn。

问题:

  1. Google Cloud Spanner是否支持为单个查询使用多个单个列索引的功能?当我尝试在Cloud Spanner中运行一些基准测试时,看起来它是受支持的,但没有关于它的正式文档。
  2. 如果它不受支持,是否有其他方法可以使用Google Cloud spanner构建此功能?

共有1个答案

洪成济
2023-03-14

>

  • 不幸的是,索引交集和并集处于积压状态。Cloud spanner将选择一个索引(如果适用),但范围仅限于单个索引。如果您有一个大的连接,将使用最有选择性的单列索引。

    您总是可以通过重写SQL语句来创建索引、交集和并集。例如,

    从A中选择*,其中x=1和y=1;

    可以重写为

    从A中的键((从A中选择x=1)相交的键(从A中选择y=1))中的键(从A中选择y=1);

    同样,

    可以重写为

    在((从A WHERE key FROM x=1)UNION(从A WHERE x=1选择key FROM y=1选择key FROM A)中选择*;--如果不希望有大量行满足任一谓词,则可以添加全部。

    希望能有所帮助。

  •  类似资料:
    • 我有点困惑。在谷歌云SQL常见问题页面上说UDF不支持。但是,我可以导入现有函数或在数据库中创建新函数。所以,为了确认,谷歌云SQL现在支持UDF创建吗?我们需要验证这一点,因为我们计划将现有数据库移动到谷歌云SQL它使用了大量的UDF。我正在云中设置MySQL数据库版本5.6(预览版)SQL 谢谢你。

    • 理想情况下,我希望使用实例id、项目名称、数据库名称、一个服务帐户电子邮件和一个p12文件的组合,但对其他身份验证选项是开放的。 编辑:在尝试策略时,我生成了这个日志文件,以备不时之需https://gist.github.com/aryeh-looker/e6b1b1617d301f0a247463216c96535d

    • 我想创建一个应用程序,在后端我想写代码node.js谷歌云平台支持node.js? 我可以看到只有Python,Java,PHP和GO支持。

    • 合并两个已有的索引比重新对所有数据做索引更有效率,而且有时候必须这样做(例如在“主索引+增量索引”分区模式中应合并主索引和增量索引,而不是简单地重新索引“主索引对应的数据)。因此indexer有这个选项。合并索引一般比重新索引快,但在大型索引上仍然不是一蹴而就。基本上,待合并的两个索引都会被读入内存一次,而合并后的内容需要写入磁盘一次。例如,合并100GB和1GB的两个索引将导致202GB的IO操

    • 我想用Javascript实现合并排序作为一种学习经验。我有mergeSort(unsortedArray)函数,它接受一个未经排序的数组,并使用合并排序策略对其进行排序。mergeSort()调用merge(leftArray,rightArray),后者将两个数组合并在一起,得到一个数组。 我认为问题出在merge()函数上。在数组[8,8,7,5,4,6,3,2,1,5,9,8,7,6,5,

    • 我注意到开发人员控制台似乎没有公开任何可以配置静态环境变量的地方。 GAE是否期望我将这些变量打包为构建服务器部署的一部分?如果是的话,是否有关于GAE/Google Cloud的任何文档说明了原因或详细说明了这一理念?