前言:自己的对知识的复习和归纳,参考网上资料和书籍(Mysql高性能),部分概念便于理解会做简单处理。
数据库中使用什么数据结构作为索引呢?
数据库的需求?
比较常见的查找需求:
假设是树结构呢,有什么问题?
我们来看下最简单的二叉树(以下提到的二叉树都指平衡二叉树)
那如果采用最简单的二叉树(平衡二叉树)作为数据库的索引存储,有什么问题呢?
首先,索引是存储存在在硬盘的。
(比如:给某张表,1亿的数据记录建立二叉查找树索引,索引中大概会有一亿的节点,假设每个节点占用16字节,大约需要1GB)
1.不支持区间查找 — > 非叶子节点不存储数据,只做索引(叶子节点的索引),然后把叶子节点连接起来,就可以支持区间查找。
2.速度慢(把数据存储在硬盘,每个节点的读取或者访问,都对应一次磁盘IO操作(ms级别),数的高度就对应每次查询的IO次数。) — > 降低树的高度,M叉树。
如果M位100, 100叉树,一亿的索引节点,树的高度为3,所以最多3次磁盘IO操作就能获取到数据。
所以,索引的查找从磁盘IO读取变成内存查找。
这就是B+树(有序数组链表+平衡多叉树)
什么是B树(多路平衡查找树):
只是一个每个节点的子节点个数不能小于 m/2 的m叉树 –> 有序数组 + 平衡多叉树
B+树、磁盘 == 非常快的查找速度(索引):
比较:二叉树 — >如果索引数据大,树高度深,相邻数据的节点在物理位置距离远,每次预读取的数据基本基本不会被用到。
那我们来看下磁盘是怎么读取数据的?
先看下磁盘结构:
磁盘的读写:读写主要是通过传动手臂上的读写磁头来完成。实际运行时,主轴让磁盘盘片转动,然后传动手臂可伸展让读写磁头在盘片上进行读写操作。
扩展:磁盘顺序读取的效率很高。合理利用,顺序读取的速度甚至比内存高(kafka、rocketMq等中间件,就是利用磁盘的顺序读取,来实现高性能)。
聚簇索引和非聚簇索引
聚簇索引和非聚簇索引概念
聚簇的意思:数据行被按照一定顺序一个个紧密地排列在一起存储。(索引是有序的)
InnoDB : 主键索引和数据文件简单理解为同一份文件
从MYISAM存储的物理文件我们能看出,MYISAM引擎的索引文件(.MYI)和数据文件(.MYD)是相互独立的。
聚簇索引的优点和缺点
扩展:
InnoDB的插入:
首先,操作系统写磁盘是定期flush将缓存刷到磁盘。
多条记录如果是按照主键索引的顺序插入:
多条记录的非主键索引的插入:
基础知识
1亿 = 100000000
1G等于1024M,1M等于1024KB,1KB等于1024B,1B等于8位(bit)
1秒=1000毫秒(ms), 1秒=1000000微妙(μs), 1秒=1000000000纳秒(ns)
简单总结:
寄存区 = 1ns
CPU缓存的读取的速度 == 1 – 10ns
内存的读取速度 = 100 -150ns
硬盘 = 3 – 15ms
网络去读 = 10ms
所以,简单理解为 硬盘差内存的1w倍, 内存差CPU缓存100 倍,CPU缓存差寄存器10倍;