前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >B+树索引使用(6)最左原则 --mysql从入门到精通(十八)

B+树索引使用(6)最左原则 --mysql从入门到精通(十八)

作者头像
用户9919783
发布2022-07-26 12:23:10
5320
发布2022-07-26 12:23:10
举报
文章被收录于专栏:后端从入门到精通

上篇文章我们说了,myISAM表和innoDB表的不同,myISAM吧用户记录数据放在数据文件,会给每行数据一个行号,myISAM会给主键生成索引,吧索引页放在索引文件。B+树的叶子节点存储的是主键+行号,意味着第一次通过主键查询只能查到行号,之后回表,通过行号查询数据文件整行数据。而innoDB的聚簇索引不需要二次查询。

B+树(5)myISAM简介 --mysql从入门到精通(十七)

索引的代价

理解索引的原理之后,就会知道索引并不是没有缺点的。

1、空间上的代价:我们知道每个页都是16kb大小,而一颗b+树有每个节点都属于一个页,这样建立太多索引对空间内存占用非常大。

2、时间上的代价:索引会吧每个页按从小到大组成一个双向链表,内节点或者底层叶子节点里的数据也是按索引从小到大组成一个单向链表,这样每次进行增,删,改操作可能都会对节点排序和页记录进行破坏,所以如果建立太多索引,对表的增删改性能影响很大。

B+树索引使用场景

下面我们开始使用b+树索引,所有使用技巧都源于你对b+树索引特征本质的理解,如果你还不能理解前面的文章,建议你去读一遍,不然下面的文字对你来说是一种折磨,看了就会忘记。下面我们来介绍b+树索引的查询情况,先建立个表,存储人的基本信息,设置id为主键,这样innoDB会默认创年聚簇索引,在显示创建idx_name_birthday_phone为复合索引,所以在列b+树的叶子节点会有name,birthdate,phone和主键id,不会有country。

代码语言:javascript
复制
mysql> create table person_info(
    -> id int not null auto_increment,
    -> name varchar(100) not null,
    -> birthday date not null,
    -> phone char(11) not null,
    -> country varchar(100) not null,
    -> primary key (id),
    -> key idx_name_birthday_phone (name,birthday,phone)
    -> );
Query OK, 0 rows affected (0.05 sec)

聚簇索引的叶子节点存储的是用户记录数据,因为我们创建了复合索引,复合索引的叶子节点存储的是name,birthday,phone,没有country,查询的时候:1)先按name排序。2)name相同按birthday排序。3)birthday也相同,按phone排序。

全值匹配查询

代码语言:javascript
复制
SELECT * FROM person_info WHERE name = '' AND birthday = '' AND phone = '';
//改成这样也不会有影响
SELECT * FROM person_info WHERE  birthday = '' AND phone = '' AND name = '' ;

当我们用如上sql时,就是全值匹配查询,不管用哪条sql,mysql的查询优化器,都会根据建立的联合索引查询,1)先查询name。2)name相同时候查询birthday。3)birthday也相同时候查询phone。

匹配最左原则

代码语言:javascript
复制
//sql1
SELECT * FROM person_info WHERE name = '' AND birthday = '';
//sql2
SELECT * FROM person_info WHERE name = '' ;
//sql3
SELECT * FROM person_info WHERE  birthday = '' AND phone = '';
//sql4
SELECT * FROM person_info WHERE name = ''  AND phone = '';

当我们用sql1和sql2查询的时候,依旧可以触发联合索引来查询数据,但如果使用sql3是不能触发联合索引的,因为我们建立的索引是按name先排序比较,比较相同之后,采用birthday比较,但现在没有查询name,导致无法使用联合索引查询。我们用sql4也能触发索引查询,但不能用phone比较,原因与sql3相同,必须birthday比较完才可以比较phone排序。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-08-24,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 后端从入门到精通 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 索引的代价
  • B+树索引使用场景
  • 全值匹配查询
  • 匹配最左原则
相关产品与服务
对象存储
对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档