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+树的高度更小。