浅谈Mysql索引

知识先知

相信我们都知道,想要加快sql查询速度的话,可以通过加索引的方式,至于利用一些优化工具的话,其实也是检测语句是否是最优,进而在优化语句的基础上,再增加索引。
何为索引,其实通俗讲就是排好序的数据结构,存储在文件里面,究竟存储在哪些文件中,我们这里先按下不表,后文会说明。

前因后果

现在,咱们开始聊聊, cpu 是如何把磁盘的文件读取到内存中所消耗的时间,包括寻道时间(速度慢)和旋转时间(速度快),如果在极端情况下,我们读取一行数据也就是进行了一次 I/O 操作,可见时间损耗是如此的大;那么我们又利用什么数据结构来存储索引呢?

1.这里我们先举例 key - value 的方式存储到二叉树(红黑树)中, key 对应索引值, value 对应磁盘磁道的物理地址,如下图所示。
在这里插入图片描述
其实在 jdk1.8 中便是对 hasmap 存储方式做了改善,便是利用的红黑树.但是利用在大数据量的情况下,树的高度会比较高,因此 I/O 操作也会比较多;

那么我们该如何减少树的高度呢?其实只要让每一个节点横向扩展多一些,树的高度也就低了,所以一次I/O操作,便可以读取一行,从硬盘加载到内存中,然后循环遍历寻找;如下图BTree数据结构。

2.BTree 树中同样也存在问题,虽然减少了树的高度,但是无疑增加了行的宽度。
在这里插入图片描述

3.B+Tree 树,在 BTree 的基础上进一步优化存储方式,减少了行的宽度。
在这里插入图片描述

阅后即练

咱们可以思考下,利用数据结构存储数据的目的,无疑是减少I/O的操作,计算机中默认一次读取是 4K 页的整数倍 ( CPU 将数据从磁盘加载内存) ,又因为 Mysql 引擎内置默认一次性可以读取16k字节数据。所以咱们可以看看三行树的高度大概可以存储多少条数据?

整型可以存储4个字节,指针大概占6字节,所以前两行的高度便是(16k/10)*(16k/10),第三行的数据因为没有存储索引,姑且认为每条数据存储1K,所以直接读取16条数据,那么三行的数据便可以存储40960000条数据。

由此可见选择合适的数据结构会极大提高查询时间和速度,但是并不是任何字段增加索引都可以提高查询速度的,增加索引也要慎用。

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值