最左前缀原理

mysql数据库中,最左前缀匹配,往往是在出现在联合索引中。首先,了解联合索引。联合索引就是指,由两个或以上的字段共同构成一个索引。比如创建表test,有a,b,c字段,创建索引dd(a,b,c),

ALTER TABLE test add INDEX dd(a,b,c)

三个字段a,b,c是有顺序的。如果顺序被打乱,执行sql将不会走索引。
例如:“select * from test where b=1 and c =2”
“select * from test where b =2”
“select * from test whre c =3”
可以通过explain 来分析 SELECT 查询语句。

EXPLAIN select * from test where a= 1 and b = 1 and c =1;

mysql 联合索引 顺序 mysql联合索引原理_数据结构

可以看到,使用explain显示了很多列,各个关键字的含义如下:

table:顾名思义,显示这一行的数据是关于哪张表的;

type:这是重要的列,显示连接使用了何种类型。从最好到最差的连接类型为:const、eq_reg、ref、range、indexhe和ALL,要是显示 ALL ,那你可要小心了,这是全表扫描的意思,性能最差,说明你的查询有很大的优化余地;

possible_keys:显示可能应用在这张表中的索引。如果为空,没有可能的索引。可以为相关的域从where语句中选择一个合适的语句;

key: 实际使用的索引。如果为NULL,则没有使用索引。很少的情况下,MySQL会选择优化不足的索引。这种情况下,可以在Select语句中使用USE INDEX(indexname)来强制使用一个索引或者用IGNORE INDEX(indexname)来强制MySQL忽略索引;

key_len:使用的索引的长度。在不损失精确性的情况下,长度越短越好;

ref:显示索引的哪一列被使用了,如果可能的话,是一个常数;

rows:MySQL认为必须检查的用来返回请求数据的行数;

Extra:关于MySQL如何解析查询的额外信息。

有关特性理解

对于联合索引,MySQL 会一直向右匹配直到遇到范围查询(> , < ,between,like)就停止匹配。
首先根据联合索引中最左边的、也就是第一个字段进行排序,在第一个字段排序的基础上,再对联合索引中后面的第二个字段进行排序,依此类推。

综上,第一个字段是绝对有序的,从第二个字段开始是无序的,这就解释了为什么直接使用第二字段进行条件判断用不到索引了(从第二个字段开始,无序,无法走 B+ Tree 索引)!这也是 MySQL 在联合索引中强调最左前缀匹配原则的原因。

为什么mysql索引使用B+Tree而不是使用hash、B-Tree区别

这里提一句,hash通过hashcode计算哈希码来确认数据的寻址,而哈希码是无法比较的,所以不能做范围检索。b+tree 的高度一般=2-3,主节点上限是16k, B+Tree 把节点上数据移到叶子节点上 这样主节点的 节点数可以存更多,叶子节点就有更多的分叉,B-tree数据存储在各层结点上,叶结点只有部分数据, 叶子节点没有联系,不适应于范围查询。而b+tree叶子节点之间有指针,而且是双向指针。即可以做范围查询。
(1)B+树更适合外部存储(一般指磁盘存储),由于内节点(非叶子节点)不存储data,所以一个节点可以存储更多的内节点,每个节点能索引的范围更大更精确。也就是说使用B+树单次磁盘IO的信息量相比较B树更大,IO效率更高。
(2)mysql是关系型数据库,经常会按照区间来访问某个索引列,B+树的叶子节点间按顺序建立了链指针,加强了区间访问性,所以B+树对索引列上的区间范围查询很友好。而B树每个节点的key和data在一起,无法进行区间查找。