高性能MySQL笔记,第一章MySQL基础

MySQL整体架构分为三层,第一层主要是用来处理连接,核心功能其实就是获取sql语句,还有一些安全方面的操作,比如登录,获取权限等

第一层获取了sql语句之后就会把sql语句交给第二层,第二层负责将sql语句进行解析和优化,以便让sql语句的执行效果更好,同时还会查询sql语句是否已经查询并留下缓存,如果存在缓存,就直接返回缓存中的东西,而不是实际查询

第三层是实际执行查询的地方,就如我们写Java代码实际上是调用各种api一样,MySQL调用各个储存引擎的接口,传入sql,获取结果

在这里插入图片描述

MySQL中最核心也是最基本的功能其实是并发控制,想一想,我们为什么不用直接在某个文件中直接写入数据的形式进行操作呢?效率是一方面原因,但还有一个关键原因,如果两个系统同时对这个简单的文件系统同时进行写入数据,会发生什么呢?两个数据被互相嵌套在一起,这个文件中保存的就不是有意义的一段文字或是其他一些东西,而是变成了一堆乱码,一堆毫无意义的乱码,而为了避免这种情况的发生,加锁是最简单而有效的解决方案

但是锁本身也是不同的,对于锁来说,可能有不同的用途,需要不同的实现方式,不同的范围,还需要对特定的数据进行优化,但是终究逃不过两大分类,读锁和写锁,而对于读取来说,其实是可以允许多个锁共同操作的,因为读取并不会改变数据,也就没有造成错误的可能,但是我们仍然是需要读锁的,因为虽然读取并不改变数据,但是如果读取的同时进行写入,读取的就有可能是错误信息了,也就是所谓的脏读,幻读或是不可重复读,在特定的情况下,这可能会导致严重的错误

锁的粒度也是需要考虑的,就像筛子,筛子的孔越小,通过的东西(数据),也就越精确,越不容易出错,但是相应的,需要筛的时间也会变长,MySQL中,有最常见的两种筛孔,表锁和行锁,故名思意,表锁是锁定一张表,而行锁是锁定一行数据,但还是略有不同,我们可以手动指定表锁,但是行锁是储存引擎自己实现的,我们并不能手动去操作他

事务也是数据库应对并发的的核心之一,不限于MySQL数据库,而说到事务就不得不提到一个比较空泛的概念,ACID,即原子性,一致性,隔离性,持久性。为什么说他们空泛呢?对于一致性,持久性,基本上就是一个美好的愿望
在这里插入图片描述
在这里插入图片描述
一致性的核心理念是,执行时,其他事务对于数据是不可见的,只能看到开始或结束的状态,例如,你有三台服务器,你通过update更新了一条记录,对于任何时候,这三台服务器都是一样的,三台服务器只有更新的状态和没更新的状态,不存在一台更新了数据,而其他两台没更新,这叫一致性,而持久性的核心是,只要sql语句执行成功,那么无论发生什么,数据库中都会保存更改
在这里插入图片描述
前者只是愿望的原因是因为性能和其他一些原因,一致性是可以被主观或客观打破的,例如上面这里例子,如果最终sql执行成功了,服务器一立即更新,同时告诉服务器二三进行更新,这个时候,是肯定会出现服务器一已经更新完成,而服务器二三刚刚接到执行成功的反馈,总不可能,大家约个时间一起展示吧,就算约个时间一起更新,大家的时间也可能会不同,这就是死循环了

而持久性就更加扯淡了,没有任何系统能保证百分之百不出问题,系统毕竟是运行在现实生活中,不是独立存在,火灾,停电,意外太多了,所以只能说出问题的概率小到一定程度,就叫持久性,并不是百分之百不出问题

相对来说,原子性和隔离性还是比较靠谱的,原子性要求要么成功,要么失败,所有操作视为一体,隔离性要求事务的操作对于其他事务是不可见的,也就是说其他事务是不知道自己在操作什么的,配合一致性的效果就是对于外界来说,事务就是一个黑盒子,是不可见的,而高级别隔离的前提就是一致性,这个并不冲突,当然,隔离级别也可能破坏一致性,比如脏读

隔离级别一般分为这么几个级别,脏读,不可重复读,幻读,序列化,脏读就是没有任何事务隔离,更接近于执行独立的sql语句,而不可重复读表示在事务执行的过程中,事务中操作的数据有被修改的可能,也就是说,在同一个事务中,两次读取的数据可能不同,幻读保证了同一个事务中多次读取的数据完全一致,但是无法避免在执行的过程中其他事务插入数据,造成数据条数不一致,而序列化是最高隔离级别,此时完全抛弃并发,所有事务单线程执行
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
脏读和序列化很好理解,但是不可重复读和幻读就没那么好理解了,我个人的理解是,当事务执行前,幻读会先检查事务中可能会调用的数据,并加上锁,防止可能会被调用的数据被修改,造成数据不一致,但是并没有锁住整张表(锁住就是序列化),此时其他事务任然可以插入数据,只是不能修改被锁住的数据,而不可重复读并没有锁这个概念,在操作的过程中其他事务可以随意操作

MySQL中的事务默认是自动提交,每一条数据都被当成一个事务自动执行,可以使用show VARIABLES LIKE “autocommit”;查看当前是否开启了自动提交

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章