复合索引(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 = '...'