5

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

| 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 场景中索引所有者列的最佳方法(性能)是什么

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

4

1 回答 1

3

这在很大程度上取决于数据的分布——只有在索引列中有良好的选择性时,索引才有意义。

例如,如果只有 2 个可能的值owner_type,即ClientUser,并且假设它们分布均匀,那么任何仅在 上的索引owner_type都是没有意义的。在这种情况下,像这样的查询

SELECT * FROM document_name_ownerships WHERE owner_type = 'Client`;

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

因此我会考虑索引

  1. 只有在 上owner_id,假设这本身就提供了很好的选择性,
  2. 或者,(owner_id, owner_type)仅当有证据表明索引 #1 不是选择性的,并且如果 2 个字段的组合提供了足够的选择性以保证索引的有效性时,才进行组合。
于 2013-10-21T11:55:57.290 回答