mysql - 多列上的多个索引

标签 mysql database indexing compound-index

假设我有一个大小合适的 MySQL 表(我们将其称为“部门”),其中有一堆像这样聚集在一起的列:

部门表:

| 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 .

关于mysql - 多列上的多个索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51832071/

相关文章:

mysql - 通过mysql更新woocommerce产品名称

mysql - 无法处理MYSQL函数中的异常

database - 为什么 Janus Graph 不被称为框架而 Apache TInkerPop 是?

android - 旋转存储在移动设备中任何位置的原始图像后,如何替换位图图像?

mysql - 如何使用 case 语句优化 select 查询?

mysql - 如何在innodb中禁用索引

mysql - MySQL同时添加多个索引

php - 就像 MySQL 和 PHP 中的逗号分隔列表一样

mysql - 选择特定列值与另一个列值接近的行?

database - 客观地从 Oracle 数据库中删除数据