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

  1. B树的每个结点存储行数据信息,B+树所有数据都存储在叶子结点上,这样每一个数据页能存储更多的数据。较之B树它的树高层级会低,进而减小磁盘IO次数,大大的加快了数据查找速度。
  2. B+树的结点之间维系着一个双向链表,且数据是有序的。因为它数据是排序好且相连的,所以对于搜索和区间查找都是很快的。而B树叶子节点指针为null,则需要进行每一层的递归遍历。相邻的元素可能在内存中不相邻,所以缓存命中性没有B+树好。

在这里插入图片描述在这里插入图片描述

为什么其他非主键索引不存储其他列的值

  • 如果非主键索引存储所有列的值,那么对于一个表里多个索引,会出现多份的表数据,内存空间开销大。
  • 另外在修改数据时需要同时修改多个索引树的数据,否则会出现数据不一致 时间效率低。
  • 在主键索引存储其他列数据,其他非主键索引存储主键索引的值,在查询时进行回表操作,综合效率较高。

为什么推荐使用InnoDB表必须建主键,且主键推荐整形的自增主键

  • 首先innodb的表必须有主键,如果不设置他会自己寻找或者维护一个主键
  • 自增主键在插入的时候方便插入,只要往后插就行。如果是乱序的会容易打乱已经排好序的数据,造成分页等现象,同时连续的时候方便查找
  • 对于其他非主键索引,他们存储着是主键的数据,整形的数据小,4byte 空间性能上高。
  • 整形在比较的时候快,比如uuid是字符的,比较效率慢。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值