首页 > 数据库 >MySQL

MySQL

时间:2022-12-04 01:00:19浏览次数:36  
标签:事务 Read Page id limit MySQL 主键

大负载

InnoDB存储

Table space:

  • leaf node segment
  • non-leaf node segment
  • rollback segment

Segment

  • Extent 1M
  • Page

Extent:

  • Page 16K,1M / 16K = 64个Page

Page:

  • Record,单向链表
  • extra info,定长
  • Page directory,槽,按主键顺序存放,一个槽可以放多个主键,二分,定长

每个记录大小不同

InnoDB索引

主键

InnoDB的存储是按照主键来存储的,每个表必须有一个主键,不指定的话会自动生成隐藏主键。

B+树

节点单位是页

通常删除都是做逻辑删除而不是物理删除,因为真删除的话会导致页和页之间的合并,影响效率。

哈希索引

当一个页被加载到内存后,可以通过哈希,让主键key作为key,对应的内存地址作为value构建哈希索引。

辅助索引

尽量减少辅助索引的个数,因为插入会不可避免的带来分裂问题

高并发

InnoDB事务

隔离级别

  • Read Uncommited,不做隔离,acid全都没有
  • Read Commited,隔离性不好,一个事务期间读相同的数据可能值不同(因为别的事务修改,自己修改不算),好的隔离性是说如果一个事务期间自己没有对一个数据做修改那么每次读到的数据都应该是一致的,排它锁
  • Repeatable Read,会有幻读情况,排它锁+共享锁
  • 串行化,表锁

MVCC

记录的隐藏字段

  • DB_TRX_ID:事务id,通常是一个数
  • DB_ROLL_PTR

快照

每个事务的快照包含:

  • trx_ids:当前事务开始前所有活跃的事务id集合
  • low_limit_id:下一个事务id
  • up_limit_id:trx_ids集合当中的最小值
Repeatable Read的快照:事务开始时产生
Read Commited:每次select的时候生成Read View

如果读到记录中的事务id比up_limit_id还小,说明在我事务开始前这个事务已经提交了,记录可看
同理,如果读到记录中的事务id大于等于low_limit_id,说明你这个事务虽然提交了,但是在你开始之前我就开始了,所以这条记录不能被我看见
如果事务id大于等于up_limit_id小于low_limit_id,那么要分情况讨论,如果事务id在trx_ids集合中,说明我开始之前已经开始但没有提交修改的事务在我还没提交之前提交了修改,所以我不能看(因为我开始的时候这条数据没有提交);否则说明我事务开始的时候修改这个数据的事务已经提交了,所以可以看

MVCC只能解决读的问题,写的问题无法解决

还有一个问题,比如库存的减少场景

标签:事务,Read,Page,id,limit,MySQL,主键
From: https://www.cnblogs.com/antidogmatist/p/16949263.html

相关文章

  • MySQL
    MySQL创建数据库我们可以在登陆MySQL服务后,使用create命令创建数据库,语法如下:CREATEDATABASE数据库名;以下命令简单的演示了创建数据库的过程,数据名为RUNOOB:[roo......
  • 《MySQL必知必会》知识汇总一
    一、使用MYSQL展示所有数据库showdatabases;选择数据库usecrashcourse;展示该数据库中所有的表showtables;还可以展示表列的shema约束showcolumns......
  • Java实现MySQL binlog日志监听
    使用案例引入maven依赖<dependency><groupId>com.github.shyiko</groupId><artifactId>mysql-binlog-connector-java</artifactId><version>0.21.0</version></......
  • mysql中的表不同类型怎么的长度
    一文搞懂字符和字节的含义(qq.com)一文搞懂MySQL的数据类型中长度的含义(qq.com)学习MYSQL要对字符类型跟长度有个明确的认识,我当初很容易搞错!这里重新学习一下......
  • mysql字符集utf8和utf8mb4的使用问题
    一、MySQL中length()、char_length()的区别和用法char_length(str)计算单位:字符不管汉字还是数字或者是字母都算是一个字符length(str)计算单位:字节utf8编码:一个汉字三个字......
  • 面试大厂 看这篇MySQL面试题就够了
    MySQL一直是面试中的热点问题,也难道了很多的面试者。其实MySQL没那么难,只是大家没有系统化、实战性的过去学习、总结。同时很多开发者在实际的开发过程中也很少去接触一些偏......
  • mysql和sql server的区别是什么?
    https://blog.csdn.net/qq_51179608/article/details/124322292实际上,每个web应用程序和数据库都扮演着重要的角色。由于当前web开发的动态特性,即使是最基本的应用程序也......
  • cpp mysql ubuntu
    1.Installlibmysqlcppconn-devsudoapt-getinstalllibmysqlcppconn-dev2.//MySQLHelper.h#include<iostream>#include<mysql_connection.h>#include<mysql......
  • mysql--约束
        外键约束:altertableempaddconstraintfk_emp_dept_idforeignkey(dept_id)referencesdept(id);添加主键altertableempdropforeignkeyfk_em......
  • [MySQL] 索引失效的情况
    1.查询条件中有or,即使有部分条件带索引也会失效2.like查询是以%开头3.如果列类型是字符串,那在查询条件中需要将数据用引号引用起来,否则不走索引4.索引列上参与计算......