mysql B树、B+树、聚集索引、非聚集索引、索引覆盖、回表

1.二叉查找树

具有以下性质:左子树的键值小于根的键值,右子树的键值大于根的键值。

2.平衡多路查找树(B-Tree)

B-Tree是为磁盘等外存储设备设计的一种平衡查找树。因此在讲B-Tree之前先了解下磁盘的相关知识。

系统从磁盘读取数据到内存时是以磁盘块(block)为基本单位的,位于同一个磁盘块中的数据会被一次性读取出来,而不是需要什么取什么。

InnoDB存储引擎中有页(Page)的概念,页是其磁盘管理的最小单位。InnoDB存储引擎中默认每个页的大小为16KB,可通过参数innodb_page_size将页的大小设置为4K、8K、16K,在MySQL中可通过如下命令查看页的大小:show variables like 'innodb_page_size';

模拟查找关键字29的过程:

根据根节点找到磁盘块1,读入内存。【磁盘I/O操作第1次】
比较关键字29在区间(17,35),找到磁盘块1的指针P2。
根据P2指针找到磁盘块3,读入内存。【磁盘I/O操作第2次】
比较关键字29在区间(26,30),找到磁盘块3的指针P2。
根据P2指针找到磁盘块8,读入内存。【磁盘I/O操作第3次】
在磁盘块8中的关键字列表中找到关键字29。

分析上面过程,发现需要3次磁盘I/O操作,和3次内存查找操作。由于内存中的关键字是一个有序表结构,可以利用二分法查找提高效率。而3次磁盘I/O操作是影响整个B-Tree查找效率的决定因素。B-Tree相对于AVLTree缩减了节点个数,使每次磁盘I/O取到内存的数据都发挥了作用,从而提高了查询效率。

3.B+Tree

3.1聚集索引图

    主键索引的叶子节点存储的是一行完整的数据

InnoDB存储引擎中页的大小为16KB,一般表的主键类型为INT(占用4个字节)或BIGINT(占用8个字节),指针类型也一般为4或8个字节,也就是说一个页(B+Tree中的一个节点)中大概存储16KB/(8B+8B)=1K个键值(因为是估值,为方便计算,这里的K取值为〖10〗^3)。也就是说一个深度为3的B+Tree索引可以维护10^3 * 10^3 * 10^3 = 10亿 条记录。

3.2非聚集索引图

非主键索引的叶子节点存储的则是主键(id)的值

4.B-Tree与B+Tree区别

1.B-Tree结构图中可以看到每个节点中不仅包含数据的key值,还有data值

2.每一个页的存储空间是有限的,如果data数据较大时将会导致每个节点(即一个页)能存储的key的数量很小,当存储的数据量很大时同样会导致B-Tree的深度较大,增大查询时的磁盘I/O次数,进而影响查询效率。

3.在B+Tree中,所有数据记录节点都是按照键值大小顺序存放在同一层的叶子节点上,而非叶子节点上只存储key值信息,这样可以大大加大每个节点存储的key值数量,降低B+Tree的高度。

4.所有叶子节点之间都有一个链指针。双向链表

5.MySQL常见索引有:主键索引、唯一索引、普通索引、全文索引、组合索引


INDEX(普通索引):ALTER TABLE 'table_name' ADD INDEX index_name('col')             最基本的索引,没有任何限制 
UNIQUE(唯一索引):ALTER TABLE 'table_name' ADD UNIQUE('col')                        与“普通索引”类似,不同的就是:索引列的值必须唯一,但允许有空值。 
PRIMARY KEY(主键索引):ALTER TABLE 'table_name' ADD PRIMARY KEY('col')       是一种特殊的唯一索引,不允许有空值。 
FULLTEXT(全文索引):ALTER TABLE 'table_name' ADD FULLTEXT('col')                    仅可用于MyISAM和InoDB,针对较大的数据,生成全文索引很耗时耗空间
组合索引:ALTER TABLE 'table_name' ADD INDEX index_name('col1','col2','col3')             为了更多的提高mysql效率可建立组合索引,遵循“最左前缀”原则。创建复合索引应该将最常用(频率)做限制条件的列放在最左边,一次递减。组合索引最左字段用in是可以用到索引的。相当于建立了col1,col1col2,col1col2col3三个索引

6.聚集索引,非聚集索引、覆盖索引、回表

1.主键索引又称聚集索引,普通索引,组合索引、唯一索引统称为非聚集索引

2. 主键索引的叶子节点存储的是一行完整的数据

3.非主键索引的叶子节点存储的则是主键(id)的值

4.回表:先通过普通索引的值定位聚簇索引值,再通过聚簇索引的值定位行记录数据,需要扫描两次索引B+树,它的性能较扫一遍索引树更低。 

5.覆盖索引:只需要在一棵索引树上就能获取SQL所需的所有列数据,无需回表,速度更快。简单说就是,select 列,是 叶子节点存储的索引列+主键ID,不需要额外去主键索引树查看

7.索引规则

1.组合索引 遵循 最左原则,('col1','col2','col3')相当于建立了col1,col1col2,col1col2col3三个索引

2.范围索引 (a,b,c)  其中字段C代表范围字段,放在最右

3.建立索引的字段,越散列越好,例如:那女不适合建立索引

4.like 'a%' 匹配索引,like '%a%'则不匹配索引

5.深分页,1.select * from table where id > ${maxId}  limie 10,或者es

6.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值