【问题标题】:Multiple indexes on multiple columns多列上的多个索引
【发布时间】:2019-01-20 18:12:50
【问题描述】:

假设我有一个大小合适的 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`)

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

【问题讨论】:

  • 索引不会提升所选列,根据您的情况,您需要一个组合索引KEY `indxqry` ( `queryable_id` , `queryable_type` )
  • @JawadAlShaikh 感谢您的回复 - 您是否可以推荐任何可以帮助我更好地理解您所说的概念的阅读材料?
  • @danblack answer提供完整答案,并有效参考有关索引的官方文档
  • 对于这个例子,有一个 2 列的复合索引,按任意顺序。

标签: mysql database indexing compound-index


【解决方案1】:

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

  • 加入
  • 哪里(常量字段)
  • 哪里(范围字段)
  • 排序
  • 分组

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

虽然您可以将检索到的字段包含在索引中,但它的缺点是会增加索引中条目的大小并降低搜索索引的速度。如果您在异常常见的查询中有一个小字段,那可能是值得的,但是如果您的情况似乎为时过早。

所以:

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

【讨论】:

    【解决方案2】:

    两点回答你的问题:

    1. 索引将基于WHERE 子句中的属性,而不是SELECT 子句中的属性。
    2. 您应该在所需的最少属性上构建索引,因为如果您包含的属性比需要的多,那么您的插入和更新也必须更新索引,从而导致它们变慢。

    【讨论】:

      猜你喜欢
      • 2017-01-10
      • 2021-10-30
      • 2011-07-11
      • 2017-11-19
      • 2018-11-05
      • 2019-02-09
      • 1970-01-01
      • 2011-11-07
      • 2010-09-15
      相关资源
      最近更新 更多