Mysql索引理解

Mysql索引

(1)索引的本质:排好序的数据结构(关于数据结构的网站 Data Structure Visualizations)

(2)没有建立索引的方式查询数据的实质= 磁盘的IO的交互

(3)MYSQL的底层索引结构用的是B-Tree

几种数据结构

二叉树
红黑树(本质是二叉树 学名:二叉平衡树) 
Hash表
B-Tree(B树):

MYSQL底层使用的数据结构

mysql 底层是B+Tree  实质上:多叉平衡树 按照页为单位。叶子节点包含所有的索引的地址

统计一页可以存储的索引数
Mysql 默认页的大小 (16kb)  一个索引+磁盘地址(14bit)

> 16*1024/14
1170.2857142857142

得出:一个页可以存储1170个索引,大概。

PS:千万级别的数据只要合理的使用索引,查询的效率依然比较快。新版本的mysql除了叶子节点,其他的都已经加到内存里面了。但是建议上千万还是分库分表,不仅需要顾虑查询的速度,还要考虑写入的速度。


数据库存储引擎的介绍

1、存储引擎修饰的是表级别的
2、两种常见的存储引擎的介绍MyISAM和InnoDB
3、mysql 安装目录下有一个data文件夹,保存的表格的结构数据库。

MyISAM

保存的文件格式如下,包含下面的三种文件格式

(1).frm :framework,结构
(2).MYD :表的行记录数据
(3).MYI: 表的索引数据

数据保存方式:B+树叶子节点存放的是索引所在行数据的地址(就是说需要根据这个地址进行下一步寻找)

缺点:不支持事务


Innodb 


文件只有两种:
.frm
.ibd: 数据和索引
数据保存方式:叶子节点存放的是索引所在行的数据(所以这个查询的效率是比上面的MyISAM快的)


聚集索引和非聚集索引的区别新理解
聚集索引:索引和行数据保存在一个文件块 (查询效率高)
非聚集:索引和行数据分开存放


为什么InnoDB表最好建立主键并且是使用整型递增的?

为什么主键?

B+树的格式存储,一般是按照主键来管理的。如果没有主键,会自动找一所有数据不相同的列作为主键,如果还是没有的话,会自动加一个隐藏列(这样就比较耗费Mysql的资源,所以自己建主键可以减少数据库压力)。

为什么要递增?

B+树添加新元素的时候,每页容许的元素的格式是有限制的,多了会分裂,由于树的分裂和平衡效率不高,所以最好是使用递增的方式添加,在后面添加的话,引发分裂的概率会比较小。

为什么整型?

不推荐使用uuid的方式。(1)整型比较大小的效率高。(2)Mysql线上存储的方式是高速SSD,整型占用空间小(具体查看字符串型和整型的存储方式)。

 

索引存储的方式 BTree和Hash

Hash

hash 运算 包括( MD5 CRC16 这些加密算法 )工作中Hash很少用,hash不支持范围查询,适合精确查询。

Btree

B+树是可以很好的进行范围查询的(叶子节点有一个双向的指针,重要的特性:排好序)

B树和B+树的比较

比较B树,是没有双向指针的,不能很好的支持范围的查找,所以B树没有B+数优。
B树和B+树的比较,存储同样节点的情况下,B+树的高度更小。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值