复合索引(mysql)的正确顺序是什么

复合索引(mysql)的正确顺序是什么,mysql,database,indexing,composite-index,Mysql,Database,Indexing,Composite Index,我已经读到,在复合索引中,您应该先将最具体的列排序,然而我的想法是,由于我对索引映射在内存中的工作方式的理解(或缺乏理解),最理想的方法是首先覆盖最不具体的索引 例如,如果我有一个表,vehicles有三列,vehicle,type和driver 车辆可过滤为3个可能值汽车,自行车,直升机 类型可过滤为6个值,汽油机/自动,汽油机/手动,柴油机/自动,电动/自动,电动/手动 driver是驱动程序的名称(值的数目不确定) -- 如果按车辆过滤可以返回1000个结果,按类型500个结果,按驾驶员过

我已经读到,在复合索引中,您应该先将最具体的列排序,然而我的想法是,由于我对索引映射在内存中的工作方式的理解(或缺乏理解),最理想的方法是首先覆盖最不具体的索引

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

车辆
可过滤为3个可能值
汽车
自行车
直升机

类型
可过滤为6个值,
汽油机/自动
汽油机/手动
柴油机/自动
电动/自动
电动/手动

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

--

如果按
车辆
过滤可以返回1000个结果,按
类型
500个结果,按
驾驶员
过滤可以返回3个结果,那么最佳索引不应该是
车辆、类型、驾驶员
?因为如果索引以
driver
开头,这难道不意味着在进一步按
类型进行过滤之前,先扫描一个巨大的索引,然后再按
车辆进行过滤吗

有人能帮我澄清一下,并向我解释一下,如果我要先订购最具体的栏目,为什么要这样做,以及它是如何工作的?

  • 在测试所有3列的
    =
    时,它们在
    索引
    WHERE
    子句中的顺序并不重要
  • 当测试一些列的
    =
    和一些列的范围(
    介于
    之间等)时,将
    =
    列放在
    索引的第一位。索引将不会在第一个范围之外使用
  • 当测试1列或2列时,需要先测试这些列
由于这些指导原则,您可能会发现不同的查询需要不同的
索引

更多:

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

如果按车辆过滤可以返回1000个结果,按类型过滤可以返回500个结果,按驾驶员过滤可以返回3个结果

(假设
中没有其他相关内容,其中

为此

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

这非常有用:
索引(车辆、类型、驾驶员)
。此外,
WHERE
子句和
索引可以有不同的顺序。

这是否回答了您的问题?(你投票时我又加了一些。)
    WHERE vehicle = '...'
      AND type    = '...'
      AND driver  = '...'