mysql - 多列上的多个索引
问题描述
假设我有一个大小合适的 MySQL 表(我们将称之为departments
),其中包含一堆聚集在一起的列,如下所示:
部门表:
| id | ds_settings | ds_reports | sales_settings | sales_reports | eng_settings | eng_reports | ops_settings | ops_reports | queryable_id | queryable_type |
|----|-------------|------------|----------------|---------------|--------------|-------------|--------------|-------------|--------------|----------------|
因此,就列而言,我们有“设置”和“报告”。查询此表时,它通常会查找给定“可查询”ID 和类型的所有设置或报告。
因此,对该表的大多数查询最终会看起来像这样:
SELECT ds_settings, sales_settings, eng_settings, ops_settings
FROM departments
where queryable_id = 1
AND queryable_type = "User"
为什么问题是,索引该表的正确方法是什么?包含包含所有“设置”和所有“报告”的索引是否具有设计意义,例如:
UNIQUE KEY `index_on_settings` (`queryable_id`,`queryable_type`,
`ds_settings`,`sales_settings`,`eng_settings`)
...或者这是对复合索引应该如何工作的误解?
解决方案
在考虑键时,应按顺序将以下元素用于索引。用于:
- 加入
- 其中(常量字段)
- 哪里(范围字段)
- 排序
- 通过...分组
在这种情况下,您通过常量查找值搜索两个字段,因此将它们保留为索引。没有必要强加一个唯一的约束。
虽然您可以将检索到的字段包含在索引中,但它的缺点是会增加索引中条目的大小并使其搜索索引变慢。如果您在异常常见的查询中有一个小字段,那可能是值得的,但是如果您的情况似乎为时过早。
所以:
ALTER TABLE departments ADD KEY index_on_settings (queryable_id, queryable_type)
我假设id
是主键。
推荐阅读https://dev.mysql.com/doc/refman/8.0/en/mysql-indexes.html。这里还有一个关于索引使用的很好的介绍https://github.com/jynus/query-optimization。
推荐阅读
- r - R中的逐行模拟
- python - Seaborn 联合图组颜色编码(用于散点图和密度图)
- cocoa - Cocoa swift:如何将 NSTextField 设置为只接受数字
- java - 如何从 JAX-RS Web Target Decorator 获取 Jersey Web Target?
- machine-learning - 微型 YOLOv3(暗网)训练“太快”并产生不同的输出
- python - 提取某种颜色的文本,忽略其余部分
- python - 使用 Python 进行反向转换
- c++ - 为什么重载运算符不能使用引用接受这些参数?
- c# - 如何从 SqlDataReader 克隆数据,以一种可以通过方法导出的方式保留所有列和行?
- junit5 - 获得“预计至少有 1 个符合自动装配候选资格的 bean。依赖注释”