怎么理解mysql 怎么理解过去一百年党的伟大成就

深入理解mysql的联合索引 最近在学习MySQL的存储引擎和索引的知识 。看了许多篇介绍MyISAM和InnoDB的索引的例子,都能理解 。
像这张索引图:
PS:该图来自大神张洋的《MySQL索引背后的数据结构及算法原理》一文 。
但许多文章讲述的都是单列索引,我很好奇 联合索引对应的结构图是怎样的 。
比方说联合索引 (col1, col2,col3),我知道在逻辑上是先按照col1进行排序再按照col2进行排序最后再按照col3进行排序 。因此如果是select * from table where col1 = 1 and col3 = 3的话,只有col1的索引部分能生效 。但是其物理结构上这个联合索引是怎样存在的,我想不懂 。
上网查阅了许多资料,总算有点眉目了 。
假设这是一个多列索引(col1, col2,col3) , 对于叶子节点,是这样的:
PS:该图改自《MySQL索引背后的数据结构及算法原理》一文的配图 。
也就是说,联合索引(col1, col2,col3)也是一棵B Tree,其非叶子节点存储的是第一个关键字的索引,而叶节点存储的则是三个关键字col1、col2、col3三个关键字的数据,且按照col1、col2、col3的顺序进行排序 。
配图可能不太让人满意,因为col1都是不同的,也就是说在col1就已经能确定结果了 。自己又画了一个图(有点丑),col1表示的是年龄,col2表示的是姓氏,col3表示的是名字 。如下图:
PS:对应地址指的是数据记录的地址 。
如图,联合索引(年龄, 姓氏,名字) , 叶节点上data域存储的是三个关键字的数据 。且是按照年龄、姓氏、名字的顺序排列的 。
因此,如果执行的是:
select * from STUDENT where 姓氏='李' and 名字='安';
或者
select * from STUDENT where 名字='安';
那么当执行查询的时候,是无法使用这个联合索引的 。因为联合索引中是先根据年龄进行排序的 。如果年龄没有先确定 , 直接对姓氏和名字进行查询的话,就相当于乱序查询一样,因此索引无法生效 。因此查询是全表查询 。
如果执行的是:
select * from STUDENT where 年龄=1 and 姓氏='李';
那么当执行查询的时候,索引是能生效的,从图中很直观的看出,age=1的是第一个叶子节点的前6条记录,在age=1的前提下,姓氏=’李’的是前3条 。因此最终查询出来的是这三条,从而能获取到对应记录的地址 。
如果执行的是:
select * from STUDENT where 年龄=1 and 姓氏='黄' and 名字='安';
那么索引也是生效的 。
而如果执行的是:
select * from STUDENT where 年龄=1 and 名字='安';
那么,索引年龄部分能生效,名字部分不能生效 。也就是说索引部分生效 。
因此我对联合索引结构的理解就是B Tree是按照第一个关键字进行索引 , 然后在叶子节点上按照第一个关键字、第二个关键字、第三个关键字…进行排序 。
而之所以会有最左原则,是因为联合索引的B Tree是按照第一个关键字进行索引排列的 。
联合索引在B 树上的结构介绍
mysql是怎样运行的 从根儿上理解mysqlMySQL架构如下怎么理解mysql:
我们写的sql语句通过client对接MYSQL的连接层怎么理解mysql , 然后有查询缓存怎么理解mysql,语法解析器怎么理解mysql,优化器,生成最终执行计划 , 然后去查询插件式存储引擎,如InnoDB等 。我们的数据是通过存储引擎来和物理设备交互的 。
正确理解MYSQL的幻读一、定义
1、幻读MYSQL官方叫法是Phantom Rows,意为鬼影行或者幻影行,请看官方定义:
The so-called phantom problem occurs within a transaction when the same query produces different sets of rows at different times. For example, if a [ SELECT ] is executed twice, but returns a row the second time that was not returned the first time, the row is a “phantom” row.
翻译一下:
所谓的幻影行问题是指,在同一个事务中,同样的查询语句执行多次,得到了不同的行结果集 。
例如,如果同一个SELECT语句执行了两次,第二次执行的时候比第一次执行时多出一行,则该行就是所谓的幻影行 。
2、幻读与不可重复读的区别
从官方的定义来看,幻读的定义侧重于多条记录 , 就是记录条数的变化,而不可重复读侧重于单条记录数据的变化,这样区分原因在于解决幻读需要范围锁 , 解决不可重复读只需要单条记录加锁
二、InnoDB的REPEATABLE READ级别
InnoDB支持由SQL1992标准描述的所有四个事务隔离级别,默认隔离级别是 REPEATABLE READ 。
1、快照读:
在RR模式下,第一次读取会建立快照,后续查询会读取快照 。
这意味着,如果在同一事务中发出多个普通[ SELECT ](非锁定)语句,则这些 [ SELECT ]语句的结果也是一致的 。
2、[locking reads](锁定读取 , 又叫当前读)
[ SELECT ]语句中使用 FOR UPDATE 或 FOR SHARE
3、行锁
在RR模式下,使用当前读以及 [ UPDATE ]和 [ DELETE ]语句会对数据记录加行锁,锁定范围取决于该语句使用的是具有唯一搜索条件的唯一索引还是范围类型搜索条件 。
三、InnoDB的READ COMMITTED级别
1、在RC模式下 , 每次读取都会刷新快照,因此不能保证可重复读
2、在RC模式下,使用当前读以及 [ UPDATE ]和 [ DELETE ]语句会对数据记录加行锁 , 但是不会加范围锁,间隙锁定仅用于外键约束检查和重复键检查 。
3、由于禁用了间隙锁定,因此可能会产生幻影行问题 , 因为其他会话可以在间隙中插入新行 。
4、 对于[ UPDATE ]或 [ DELETE ]语句,InnoDB 仅对其更新或删除的行持有锁 。MySQL评估 WHERE 条件后,将释放不匹配行的记录锁。这大大降低了死锁的可能性,但是仍然可以发生 。
5、对于[ UPDATE ]语句,如果某行已被锁定,则 InnoDB执行“半一致”读取,将最新提交版本的数据返回给MySQL,以便MySQL可以确定该行是否符合WHERE 条件 。如果该行匹配(必须更新),则MySQL会再次读取该行,这一次 InnoDB 会将其锁定或等待获取锁 。
6、注意
从MySQL 8.0.22开始,DML操作(增删改 , 通过联接列表或子查询)从MySQL授权表中读取数据,但不对其进行修改 , 无论隔离级别如何,都不会在MySQL授权表上获得读取锁 。
有关更多信息,请参见Grant Table Concurrency。
四、乐观锁与悲观锁
1、乐观锁
在UPDATE的WHERE子句中加入版本信息来确定修改是否生效
使用乐观锁时仍然需要非常谨慎 , 因为RR是可重复读的,在UPDATE之前读取版本号 , 应该使用[当前读],不能使用[快照读]
2、悲观锁
在UPDATE执行前,SELECT后面加上FOR UPDATE来给记录加锁,保证记录在UPDATE前不被修改 。SELECT ... FOR UPDATE是加上了X锁,也可以通过SELECT ... LOCK IN SHARE MODE加上S锁,来防止其他事务对该行的修改 。
3、无论是乐观锁还是悲观锁,使用的思想都是一致的,那就是当前读 。乐观锁利用当前读判断是否是最新版本 , 悲观锁利用当前读锁定行 。
五、总结
1、RC级别没有范围锁一定会导致不可重复读和幻影行
【怎么理解mysql 怎么理解过去一百年党的伟大成就】2、RR级别安全性更高,实现可重复读的方式为快照,如果需要最新数据可以选择[当前读],因此RR级别是首选
3、不论RR还是RC级别,增、删、改的操作都会进行一次[当前读]操作,以此获取最新版本的数据,并检测是否有重复的索引 。
4、RR级别下,当前事务如果未发生更新操作(增删改),快照版本会保持不变,多次查询读取的快照是同一个
5、RR级别下 , 当前事务如果发生更新(增删改),会刷新快照,会导致不可重复读和幻影行
6、RR级别下,使用当前读,会刷新快照,会导致不可重复读和幻影行
7、RR级别下,可以通过提交当前事务并在此之后发出新查询来为查询获取更新的快照 。
8、RR级别可以部分解决不可重复读和幻读问题
9、其实问题的关键是你的业务逻辑需要可重复读还是最新数据
mysql是怎样运行的从根儿上理解mysql电子书《MySQL是怎样运行怎么理解mysql的:从根儿上理解 MySQL》采用诙谐幽默怎么理解mysql的表达方式 , 对MySQL的底层运行原理进行了介绍,内容涵盖了使用MySQL的同学在求职面试和工作中常见的一些核心概念 。总计22 章 , 划分为4个部分 。第1部分介绍了MySQL入门的一些知识,比如MySQL的服务器程序和客户端程序有哪些、MySQL的启动选项和系统变量,以及使用的字符集等 。第2部分是本书后续章节的基?。?介绍了MySQL的一些基础知识,比如记录、页面、索引、表空间的结构和用法等 。第3部分则与大家在工作中经常遇到的查询优化问题紧密相关,介绍了单表查询、连接查询的执行原理,MySQL基于成本和规则的优化具体指什么,并详细分析了Explain语句的执行结果 。第4部分则是与MySQL中的事务和锁相关,介绍了事务概念的来源,MySQL是如何实现事务的,包括redo日志、undo日志、MVCC、各种锁的细节等 。
尽管《MySQL是怎样运行的:从根儿上理解 MySQL》在写作时参考的MySQL源代码版本是5.7.22,但是大部分内容与具体的版本号并没有多大关系 。无论是很早之前就已身居MySQL专家的人员,还是希望进一步提升技能的DBA,甚至是三五年后才会入行的“萌新”,本书都是他们彻底了解MySQL运行原理的优秀书
怎么理解mysql的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于怎么理解过去一百年党的伟大成就、怎么理解mysql的信息别忘了在本站进行查找喔 。

    推荐阅读