MySQL技术专题10联合索引的最左匹配原则

最左匹配原则)离散度高的列优先(离散度高原则)宽度小的列优先(最少空间原则)列的离散性计算:count(distinct col)/ count(col)例如:id列一共9列都不重复 9/9 = 1 性别列一共9列只有(男或者女)两列 2/9 约等于0.2 离散性越高选择性越大 mysql 最左匹配 联合索引 ...
MySQL技术专题10联合索引的最左匹配原则
如果有一个3列索引(col1,col2,col3),实际上已经建立了三个联合索引(col1)、(col1,col2)、(col1,col2,col3)。

解释

1、b+树的数据项是复合的数据结构,比如(name,age,sex)的时候,b+树是按照从左到右的顺序来建立搜索树的,比如当(张三,20,F)这样的数据来检索的时候,b+树会优先比较name来确定下一步的所搜方向,如果name相同再依次比较age和sex,最后得到检索的数据;但当(20,F)这样的没有name的数据来的时候,b+树就不知道第一步该查哪个节点,因为建立搜索树的时候name就是第一个比较因子,必须要先根据name来搜索才能知道下一步去哪里查询。

2、比如当(张三,F)这样的数据来检索时,b+树可以用name来指定搜索方向,但下一个字段age的缺失,所以只能把名字等于张三的数据都找到,然后再匹配性别是F的数据了, 这个是非常重要的性质,即索引的最左匹配特性。(这种情况无法用到联合索引)

mysql里创建联合索引的意义

一个顶三个

建了一个(a,b,c)的复合索引,那么实际等于建了(a),(a,b),(a,b,c)三个索引,因为每多一个索引,都会增加写操作的开销和磁盘空间的开销。对于大量数据的表,这可是不小的开销!

覆盖索引

同样的有复合索引(a,b,c),如果有如下的sql: select a,b,c from table where a=1 and b = 1。那么MySQL可以直接通过遍历索引取得数据,而无需回表,这减少了很多的随机io操作。减少io操作,特别的随机io其实是dba主要的优化策略。所以,在真正的实际应用中,覆盖索引是主要的提升性能的优化手段之一

索引列越多,通过索引筛选出的数据越少

有1000W条数据的表,有如下sql:select * from table where a = 1 and b =2 and c = 3,假设假设每个条件可以筛选出10%的数据,如果只有单值索引,那么通过该索引能筛选出1000W*10%=100w 条数据,然后再回表从100w条数据中找到符合b=2 and c= 3的数据,然后再排序,再分页;如果是复合索引,通过索引筛选出1000w *10% *10% *10%=1w,然后再排序、分页,哪个更高效,一眼便知

创建联合索引时列的选择原则

经常用的列优先(最左匹配原则)

离散度高的列优先(离散度高原则)

宽度小的列优先(最少空间原则)

列的离散性计算:count(distinct col)/ count(col)

例如:

id列一共9列都不重复 9/9 = 1

性别列一共9列只有(男或者女)两列 2/9 约等于0.2

离散性越高选择性越大

mysql 最左匹配 联合索引2022-06-23
mengvlog 阅读 11 次 更新于 2025-07-21 00:53:43 我来答关注问题0
  • 2、比如当(张三,F)这样的数据来检索时,b+树可以用name来指定搜索方向,但下一个字段age的缺失,所以只能把名字等于张三的数据都找到,然后再匹配性别是F的数据了, 这个是非常重要的性质,即索引的最左匹配特性。(这种情况无法用到联合索引)mysql里创建联合索引的意义 一个顶三个 建了一个(a,b,...

  •  深空见闻 mysql联合索引顺序问题

    MySQL联合索引顺序需遵循“最左前缀+高频高区分度优先”原则,同时规避范围查询对后续字段的影响。最左前缀匹配:联合索引要按从左到右顺序创建,查询时必须从最左列开始匹配,且不跳过中间列。例如索引(a,b,c),仅支持a、a+b、a+b+c的查询条件,不支持b、c、b+c等跳过最左列的情况。不过,若条...

  • 步骤1:创建两个表和索引列 在MySQL中,您需要首先建立两个表和要在其上创建联合索引的列。下面是创建两个表的示例代码:CREATE TABLE table1 (id INT PRIMARY KEY,name VARCHAR(50),dob DATE );CREATE TABLE table2 (id INT PRIMARY KEY,address VARCHAR(50),phone VARCHAR(10));步骤2:创建联...

  •  倍领趣闻 MySQL中如何设置唯一索引,联合索引?

    在MySQL中设置唯一索引和联合索引是优化数据库性能的重要手段。首先,如果要创建一个唯一索引,可以使用以下SQL语句:CREATE TABLE `wb_blog` (`id` smallint(8) unsigned NOT NULL,`catid` smallint(5) unsigned NOT NULL DEFAULT '0',`title` varchar(80) NOT NULL DEFAULT '',`content` text ...

  •  翡希信息咨询 3.联合索引、覆盖索引及最左匹配原则|MySQL索引学习

    最左匹配原则: 定义:在联合索引中,查询条件必须从索引的最左列开始匹配,才能有效利用索引。 应用场景: SQL仅包含WHERE子句时,所有符合条件的索引都将被利用。 SQL同时包含WHERE和ORDER BY子句时,索引将按照最左原则逐步匹配。 SQL仅包含ORDER BY子句时,同样遵循最左匹配原则。 意义:确保...

檬味博客在线解答立即免费咨询

mySQL相关话题

Copyright © 2023 WWW.MENGVLOG.COM - 檬味博客
返回顶部