MySQL底层原理笔记
1、存储引擎
MyISAM:不支持事务,支持表所不支持行锁
它的表结构、索引、数据分离开来的,非聚族索引。
底层是B+树,非叶子结点是存储部分冗余数据,为了快速定位到叶子结点的数据。因为是非聚族索引,他的叶子结点存储着是磁盘地址,每次查询查询都需要进行回表操作。
InnoDB:支持事务,支持表所和行锁
分为表结构和数据文件,索引和数据(idb)是在一起的 表数据文件本身就是按B+树组织的一个索引结构文件
底层也是B+树,非叶子结点是存储部分多余数据,为了快速定位到叶子结点的数据
对于这个分为聚集索引(主键索引)和非聚集索引,对于主键索引,他的data数据存储着其他列的数据,非主键索引存储着主键索引的值(一致性和节省内存空间)。
.
2、Hash索引和B+树索引
Hash索引,计算hash值查找快速。如果发生hash冲突,通过链表来存储。对于等值查找,in等查找方便,但是不支持区间查询。
B+树索引,所有数据都存储在叶子结点,且不同的页之间维系着双向链表,叶子结点从左到右一次递增,数据是有序的。对于等值查找,区间查找都很方便。
3、B树和B+树的区别
1、B+树在叶子结点这里维系了一个指针,从左往右依次递增,对范围查询比较符合
2、B+树数据都存储在叶子结点中,非叶子结点不存储数据,只存储索引,可以存放更多的索引,降低树高,减少磁盘io
- B树的每个结点存储行数据信息,B+树所有数据都存储在叶子结点上,这样每一个数据页能存储更多的数据。较之B树它的树高层级会低,进而减小磁盘IO次数,大大的加快了数据查找速度。
- B+树的结点之间维系着一个双向链表,且数据是有序的。因为它数据是排序好且相连的,所以对于搜索和区间查找都是很快的。而B树叶子节点指针为null,则需要进行每一层的递归遍历。相邻的元素可能在内存中不相邻,所以缓存命中性没有B+树好。
为什么其他非主键索引不存储其他列的值
- 如果非主键索引存储所有列的值,那么对于一个表里多个索引,会出现多份的表数据,内存空间开销大。
- 另外在修改数据时需要同时修改多个索引树的数据,否则会出现数据不一致 时间效率低。
- 在主键索引存储其他列数据,其他非主键索引存储主键索引的值,在查询时进行回表操作,综合效率较高。
为什么推荐使用InnoDB表必须建主键,且主键推荐整形的自增主键
- 首先innodb的表必须有主键,如果不设置他会自己寻找或者维护一个主键
- 自增主键在插入的时候方便插入,只要往后插就行。如果是乱序的会容易打乱已经排好序的数据,造成分页等现象,同时连续的时候方便查找
- 对于其他非主键索引,他们存储着是主键的数据,整形的数据小,4byte 空间性能上高。
- 整形在比较的时候快,比如uuid是字符的,比较效率慢。