equ*_*nt8 5 mysql sql indexing
假设我有与此类似的多态
| document_id | owner_type | owner_id |
| 1 | Client | 1 |
| 1 | Client | 2 |
| 2 | User | 1 |
Run Code Online (Sandbox Code Playgroud)
我知道我会调用查询来寻找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
Run Code Online (Sandbox Code Playgroud)
让我们忽略如何索引document_id 我想知道在此 SQL 场景中索引所有者列的最佳方式(性能)是什么
解决方案1:
CREATE INDEX do_type_id_ix ON document_ownerships (owner_type, owner_id)
Run Code Online (Sandbox Code Playgroud)
这样我就只有一个适用于这两种情况的索引
解决方案2:
CREATE INDEX do_id_type_ix ON document_ownerships (owner_id, owner_type)
CREATE INDEX do_type_ix ON document_ownerships (owner_type)
Run Code Online (Sandbox Code Playgroud)
通过这种方式,我将拥有与我将如何使用数据库的方式完全匹配的索引。唯一的事情是当我只有一个索引时我有 2 个索引
解决方案3:
CREATE INDEX do_id_ix ON document_ownerships (owner_id)
CREATE INDEX do_type_ix ON document_ownerships (owner_type)
Run Code Online (Sandbox Code Playgroud)
单个列索引
从我在 MySQL 控制台中探索的explain结果来看,我得到了非常相似的结果,因为它是一个新项目,我没有足够的数据来正确探索它,因此我可以 100% 确定(即使我用数百条记录填充了数据库) )。那么任何人都可以根据他们的经验给我一些建议吗?
这在很大程度上取决于数据的分布,只有索引列具有良好的选择性时索引才有意义。
owner_type例如,如果,即Client和,只有 2 个可能的值User,并且假设它们均匀分布,那么仅 的任何索引owner_type都是毫无意义的。在这种情况下,像这样的查询
SELECT * FROM document_name_ownerships WHERE owner_type = 'Client`;
Run Code Online (Sandbox Code Playgroud)
可能会返回表中很大一部分记录,并且扫描是最好的选择(尽管我假设您的实际查询将联接到派生表并过滤派生表特定的列,这将是与此查询计划非常不同。)
因此我会考虑索引
owner_id,假设这本身就具有良好的选择性,(owner_id, owner_type),并且如果 2 个字段的组合提供了足够的选择性来保证该索引。| 归档时间: |
|
| 查看次数: |
1162 次 |
| 最近记录: |