mysql – 将多个索引添加到多态表的最佳方法是什么

比方说我有类似的多态性

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

我知道我将调用查询owner_type和owner_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场景索引所有者列的最佳方法(性能)是什么

解决方案1:

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控制台中探索的解释我得到了非常相似的结果,因为它是一个新的项目,我没有提供数据来正确地探索这个,所以我将100%肯定(即使我填充数百个数据库)记录).那么,任何人都可以从他们的经验中给我一些建议吗?

最佳答案 这很大程度上取决于数据的分布 – 索引只有在
good selectivity in the indexed columns时才有意义.

例如如果owner_type只有2个可能的值,即客户端和用户,并假设它们是均匀分布的,那么只有owner_type的任何索引都是没有意义的.在这种情况下,查询就像

SELECT * FROM document_name_ownerships WHERE owner_type = 'Client`;

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

因此我会考虑索引

>仅在owner_id上,假设这本身具有良好的选择性,
>或者,仅在有证据表明索引#1不具有选择性时才对组合(owner_id,owner_type)进行组合,并且如果2个字段的组合提供足够的选择性以保证该索引.

点赞