【问题标题】:What is the correct order for composite indexes (mysql)复合索引的正确顺序是什么(mysql)
【发布时间】:2021-01-05 23:50:42
【问题描述】:

我已经读过,在复合索引中,您应该首先对最具体的列进行排序,但是我的想法是,由于我的理解(或缺乏那里),最理想的路线是首先涵盖最不具体的索引of)关于索引映射如何在内存中工作。 visual aid

例如,如果我有一个表,vehicles 有三列,vehicle、type 和 driver。

vehicle 可以过滤为 3 个可能的值car、bike、helicopter

type可以过滤为6个值,petrol/automatic、petrol/manual、diesel/automatic、diesel/manual、、electric/automatic、electric/manual

driver 是驱动程序的名称(不定数量的值)

--

如果按 vehicle 过滤可以返回 1000 个结果,按 type 过滤可以返回 500 个结果,按 driver 过滤可以返回 3 个结果,那么最佳索引不应该是 vehicle, type, driver 吗?因为如果索引以driver 开头,这是否意味着在通过type 然后vehicle 进一步过滤之前扫描一个巨大的索引?

如果我应该将最具体的列排在最前面,有人可以帮我解决这个问题,并向我解释一下,为什么以及它是如何工作的?

【问题讨论】:

标签: mysql database indexing composite-index


【解决方案1】:
  • 在测试 = 的所有 3 列时,它们在 INDEX 或 WHERE 子句中的顺序不重要。
  • 在测试= 的某些列和一些具有范围(LIKE、BETWEEN 等)的列时,将= 列首先放在INDEX 中。索引不会超出第一个范围。
  • 在测试 1 或 2 列时,这些列需要放在首位。

由于这些准则,您可能会发现不同的查询需要不同的INDEXes。

更多:http://mysql.rjweb.org/doc.php/index_cookbook_mysql

和Higher cardinality column first in an index when involving a range?

查看基数的另一种方法是它仅适用于整个索引,而不适用于单个列。选择性差会导致优化器不使用索引,而是扫描表。

如果按车辆过滤可以返回 1000 个结果,按类型过滤 500 个结果,按司机说,3 个结果

    WHERE vehicle = '...'  -- no index will be used
    WHERE type    = '...'  -- no index will be used
    WHERE driver  = '...'  -- INDEX(driver, ...) will be used

(那些假设在WHERE 中没有其他相关内容。)

为此

    WHERE vehicle = '...'
      AND type    = '...'
      AND driver  = '...'

这非常有用:INDEX(vehicle, type, driver)。此外,WHERE 子句和INDEX 可以有不同的顺序。

【讨论】:

  • (在你投票的时候我又加了一些。)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-10
  • 2020-04-21
  • 2017-03-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多