多列上的多个索引

时间:2018-08-14 00:06:49

标签: mysql database indexing compound-index

让我们说我有一个不错的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`)

...或者这是对复合索引应该如何工作的误解?

2 个答案:

答案 0 :(得分:2)

在考虑键时,应按顺序将以下元素用于索引。字段用于:

  • 加入
  • 其中(常量字段)
  • 位置(范围字段)
  • 排序
  • 分组依据

在这种情况下,您将按常量查找值按两个字段进行搜索,因此请保留它们作为索引。无需施加唯一约束。

虽然您可以在索引中包含要检索的字段,但它不利于增加索引中条目的大小,并使搜索速度变慢。如果您在一个非常常见的查询中只有一个小字段,那么值得,但是如果您的情况似乎为时过早。

所以:

ALTER TABLE departments ADD KEY index_on_settings (queryable_id, queryable_type)

我假设id是主键。

推荐阅读this article。关于索引的使用https://dev.mysql.com/doc/refman/8.0/en/mysql-indexes.html,这里也有很好的介绍。

答案 1 :(得分:1)

回答您的问题有两点:

  1. 索引将基于WHERE子句中的属性,而不是基于SELECT子句中的属性。
  2. 您应该在所需的最低限度属性上建立索引,因为如果您包含的属性超出了所需的数量,那么插入和更新操作也必须更新索引,从而导致索引变慢。