1

我已经读过,在复合索引中,您应该首先对最具体的列进行排序,但是我的想法是,由于我的理解(或缺乏),最优化的路线是首先覆盖最不具体的索引索引上的映射如何在内存中工作。视觉辅助

例如,如果我有一个vehicles包含三列、vehicletype的表driver

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

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

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

--

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

有人可以帮我澄清一下,并向我解释一下,如果我应该首先订购最具体的列,为什么以及它是如何工作的?

4

1 回答 1

1
  • 在测试所有 3 列时=,它们在or子句中的顺序无关紧要。INDEXWHERE
  • 当测试一些列=和一些具有范围(LIKEBETWEEN等)的列时,将=列放在INDEX. 该索引不会在第一个范围之外使用。
  • 在测试 1 或 2 列时,这些列需要放在首位。

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

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

当涉及范围时,索引中的基数列第一?

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

如果按车辆过滤可以返回 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从句和 the 的INDEX顺序可以不同。

于 2021-01-06T00:05:25.423 回答