MYSQL中Innodb的整理(1)

MYSQL:

Innodb是款搜索引擎,存储数据的最小单位是page,大小为16kb。默认排序,影响插入,提高查询。

页的结构:

主键索引:

页目录里存两个数据,一个是每组里最小的值,一个是指针,用空间换时间;(就是方便目录找哪一章),为了减少遍历次数,可以利用二分查找可以优化查找(因为是顺序结构);插入的时候要与前面页进行调整,所以最好自增,不要用UUID。

页上面再新增一个主键,这就是B+树,但是MySQL下面的指针是双向的,这是为了查小于的情况

特点:每个节点有多条数据,并且数据有冗余,叶子节点(最下面一层)存放了所有数据。于是查找就分为全表扫描(从最后一页扫描)和走索引(从上往下按扫描)。但是如果查找的不是主键,就进行全表扫描。

联合索引:

第一个相同,下一个从小往大。联合bcd索引,即标红的,需要复制一份主键索引

缺点:复制所有一份数据浪费资源;改这里的数值,主键表的也要改,更新不方便;

所以这么设计(只记录联合索引的):

缺点是当select*是查找的数据不完整。

 

实际上:折中后:真正的在下面加一个主键信息,在根据主键索引找完整数据。

联合索引要遵循最左匹配原则。

Buffer Pool是innoble写出来的,默认128M,持久化后就会有一块空白页,buffer poll和磁盘之间有一个free链表指针指向的都是空白页。还有一个flush链表是管理在缓存时被修改了数据,就是脏页。

如果Buffer Pool里面的数据满了,就要进行淘汰链表最后的,即lru算法,淘汰用的少的,会多一个lru链表,新的放前面,因为越靠前越最近被访问;但是如果全盘扫描,会把整个Buffer Pool数据全替换调。所以分为热数据区域和冷数据区域(大小5:3),一开始都放冷数据最前面,那放到热数据区域的机制就是看两个访问页的时间间隔大于1秒的放热数据区域(解决全盘扫描的问题)。

  

 持久化时,磁盘有一个redo log空间,保存更新的数据,服务器中断后重启时会将原数据与redolog比较进行操作

 innoDB结构:

索引是帮助MySQL高效获取数据的排好序的数据结构

索引数据结构:1.二叉树     2.红黑树       3.Hash表        4.B-Tree

 哈希索引只适用于单条数据查询,范围查询还是用B+树比较快;哈希索引不支持多列联合索引的最左匹配规则。

MySQL的隔离级别:

 1.读未提交:一个事务读到另一个未提交的事务修改的数据,产生脏读;

2.读已提交:产生不可重复读和幻读。

 不可重复读的重点是修改:同样的条件, 你读取过的数据, 再次读取出来发现值不一样了

幻读的重点在于新增或者删除:同样的条件, 第1次和第2次读出来的记录数不一样

当然, 从总的结果来看, 似乎两者都表现为两次读取的结果不一致.但如果你从控制的角度来看, 两者的区别就比较大

  • 对于前者, 只需要锁住满足条件的记录

  • 对于后者, 要锁住满足条件及其相近的记录

 

 每个事务修改时都有个事务ID,这叫事务链,select   readview里面有个m_ids存储活跃的事务ID

读已提交会把修改后提交的事务还认为是活跃的,而可重复读会把事务ID为200的修改给去掉。MVCC:多版本并发控制,解决了读并发;如果是通过加锁,会导致别人只是读数据也得等前一个事务释放锁才能读。

3.可重复读:解决了不可重复,但是还是会出现幻读(mysql帮解决了)。(默认级别)

4.串行化:可以进行读-读,但是不允许读-写,写-读的并发操作

 真实存储的数据:

锁:

读已提交:只是对查(通过列的索引,包括主键,唯一索引,普通索引)出来的行加锁,可以插入数据

可重复度:插入数据会被阻塞(加了间隙锁,插都插不进去),解决幻读

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
回答: MySQL数据库有多种存储引擎可供选择。常用的存储引擎包括InnoDB引擎、MyISAM引擎和MEMORY引擎。InnoDB引擎提供了对数据库ACID事务的支持,并且还提供了行级锁和外键的约束。它的设计目标是处理大数据容量的数据库系统。MyISAM引擎不提供事务的支持,也不支持行级锁和外键。MEMORY引擎将所有的数据存储在内存,因此数据的处理速度很快,但安全性较低。\[1\] MySQL是一个关系型数据库管理系统,由瑞典MySQL AB公司开发,属于Oracle旗下产品。MySQL是最流行的关系型数据库管理系统之一,在WEB应用方面被广泛使用。它是开源免费的,并且方便扩展。\[2\] InnoDBMySQL的默认存储引擎,而MyISAM在MySQL5.5.5之前是默认的存储引擎。\[3\] #### 引用[.reference_title] - *1* *2* [MySQL数据库面试题(2020最新版)](https://blog.csdn.net/ThinkWon/article/details/104778621)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [mysql数据库引擎常用面试总结](https://blog.csdn.net/sjyttkl/article/details/76176836)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值