gpt4 book ai didi

mysql - 向多态表添加多个索引的最佳方法是什么

转载 作者:可可西里 更新时间:2023-11-01 07:37:17 24 4
gpt4 key购买 nike

假设我有与此类似的多态性

| document_id | owner_type | owner_id |
| 1 | Client | 1 |
| 1 | Client | 2 |
| 2 | User | 1 |

我知道我会调用查询来寻找 owner_typeowner_type + owner_id

SELECT * FROM document_name_ownerships WHERE owner_type = 'Client`
SELECT * FROM document_name_ownerships WHERE owner_type = 'Client` and owner_id = 1

让我们忽略如何索引 document_id 我想知道为这个 SQL 场景索引所有者列的最佳方式(性能)是什么

解决方案一:

CREATE INDEX do_type_id_ix ON document_ownerships (owner_type, owner_id)

这样我就只有一个索引适用于两种情况

解决方案 2:

CREATE INDEX do_id_type_ix ON document_ownerships (owner_id, owner_type)
CREATE INDEX do_type_ix ON document_ownerships (owner_type)

通过这种方式,我将拥有与我使用数据库的方式完全匹配的索引。唯一的问题是我有 2 个索引,而我只能有一个索引

解决方案 3:

CREATE INDEX do_id_ix ON document_ownerships (owner_id)
CREATE INDEX do_type_ix ON document_ownerships (owner_type)

单独的列索引


根据我在 MySQL 控制台中使用 explain 探索的结果,我得到了非常相似的结果,因为这是一个新项目,我没有足够的数据来正确探索它,所以我将 100%当然(即使我用数百条记录填充了数据库)。那么任何人都可以根据他们的经验给我一些建议吗?

最佳答案

这将在很大程度上取决于您的数据分布 - 索引仅在存在 good selectivity in the indexed columns 时才有意义.

例如如果 owner_type 只有 2 个可能的值,即 ClientUser,并假设它们均匀分布,则任何索引仅在 owner_type 将毫无意义。在这种情况下,像

这样的查询
SELECT * FROM document_name_ownerships WHERE owner_type = 'Client`;

可能会返回表中的大部分记录,扫描是可能的最佳选择(尽管我假设您的真实查询将连接到派生表并过滤派生的特定于表的列,这将是一个与这个非常不同的查询计划。)

因此我会考虑索引

  1. 仅在 owner_id 上,假设这本身提供了良好的选择性,
  2. 或者,在组合 (owner_id, owner_type) 上,只有当有证据表明索引 #1 不是选择性的,并且如果这两个字段的组合提供了足够的选择性来保证这个索引。

关于mysql - 向多态表添加多个索引的最佳方法是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19493090/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com