在限制我可以使用的索引数量的同时优化查询

Posted

技术标签:

【中文标题】在限制我可以使用的索引数量的同时优化查询【英文标题】:Optimizing Queries while being limited on the number of Indexes I can use 【发布时间】:2020-03-27 16:18:31 【问题描述】:

我有一个涉及三个表连接的查询。假设这些表是 A、B 和 C。A 和 C 有一个主键,它们使用 B 拥有的 2 个外键通过等值连接连接到 B。最佳索引策略是在所有 4 个键上使用 4 个索引。但是,我可以构建的索引数量受到限制..(出于我不想进入的原因)。

表的大小使得 B 有 600 万行。 A 有 1 万行,C 有 10 万行。

我的问题是我是否应该在 B 的两个外键(表 A 和表 C)上建立单独的索引,或者我是否应该通过在表 B 的外键上创建复合索引来受益。

索引的大小不是主要问题。但是,必须在保持性能的同时尽量减少索引的数量。 A、B、C的属性也有一些过滤条件。

注意:数据库为 PostgreSQL 12,且受限于 shared_buffer_space。

编辑 查询结构是

SELECT A.a1, A.a2, B.b1, B.b2, C.c1, C.c2 
FROM 
   A INNER JOIN B ON A.a3=B.b3 AND A.a5 = <some value> AND B.b6 = <some value>
     INNER JOIN C ON B.b4=C.c4 AND C.c7 = <some value> AND C.c8 = <some other value>; 

我想知道我可以做哪些其他优化来提高查询性能,包括但不限于索引和调整性能优化器。 连接都是整数。

【问题讨论】:

请显示您要优化的查询。您的描述并不像您想象的那么清楚。 【参考方案1】:

如果您的查询如下所示:

select . . .
from b join
     a
     on a.a_id = b.a_id join
     c
     on c.c_id = b.c_id

那么就不需要额外的索引了。 ac 上的主键索引就足够了。

【讨论】:

B 上的外键索引有帮助吗? @user12984287 。 . .我不知道“外键索引”的真正含义。在某些情况下,在用于外键的列上设置索引可能会有所帮助。如果您在这些列上进行过滤,情况会更糟。 外键索引是指外键列上的索引。 @user12984287 。 . .如果您在该列或参考表中的列上进行过滤,这将有所帮助。你没有过滤器,所以我认为在这种情况下它不会有很大帮助。

以上是关于在限制我可以使用的索引数量的同时优化查询的主要内容,如果未能解决你的问题,请参考以下文章

Mysql优化/性能,如何有效使用限制|基于位置的选择

Mysql高性能优化规范建议

是否可以限制在 asyncio 中同时运行的协程数量?

ES索引设计

高性能mysql 第6章 查询性能优化

Mongodb:聚合排序限制查询的索引?