mysql基础学习

mysql的锁
读锁:读锁是共享的,或者说是相互不阻塞的,多个客户在同一时间可以同时读取同一资源,而互不干扰;

写锁:写锁则是排他的,也就是说一个写锁会阻塞其他的写锁和读锁,这是出于安全策略的考虑只有这样,才能确保在给定的时间里,只有一个用户能执行写入,并且防止其他用户读取正在写入的同一资源;

锁的弊端:加锁也需要消耗资源,锁的各种操作,包括获得锁,检查锁是否已经解除,释放锁等,都会增加系统的开销,如果系统花费大量的时间来管理锁,而不是存储数据,那么系统的性能可能会因此造成影响;

表锁:表锁是mysql中最基本的锁策略,并且是开销最小的策略,一个用户在对表进行操作(curd)前先获取写锁,这会阻塞其他用户对该表的所有读写操作,只是没有写锁时,其他读取的用户才能获得读锁,读锁之间是不相互阻塞的;

行级锁:行级锁可以最大程度的支持并并发处理(同时也带来了最大的锁开销),行级锁只在存储引擎层实现;

事务:事务就是一组原子性的SQL查询,或者说是一个独立的工作单元,如果数据库引擎能够城管的对数据库应用该组查询的全部语句,那么久执行该组查询,如果其中任何一条语句因为奔溃或其他原因无法执行,那么所有的语句都不会被执行,也就是说事务里面的语句要么全部执行,要么全部失败

事务的ACID测试:
A 原子性(atomicity):一个事务必须被视为一个不可分割的最小工作单位,整个事务中要么所有语句全被执行,要么全部失败回滚,对于一个事务来说,不可能只执行其中的一部分操作,这就是事务的原子性;
C 一致性(consistency):数据库总是从一个一致性的状态转换到另外一个一致性的状态,在执行其他语句之间时系统奔溃,账户中也不会损失钱财,因为事务最终没有提交,所以事务中所做的修改也不会保存到数据库中;
I 隔离性(isolation):通常来说一个事务所做的修改在最终提交之前,对其他事务事不可见的,当第一个事务执行一半时,此时林改一个账户汇总程序开始运行的话,账户余额结果并没有发生改变;通常来说是不可见的!
D 持久性(durability):持久性就是只一旦事务被提交则所做的修改就会永久的保存在数据库中;

事务的四个隔离级别:
READ UNCOMMITTED(未提交读):
事务中的修改及时没有提交,对其他事务也是可见的,事务可以读取未提交的数据,这也被称为赃读,这一级别不会比其他的级别性能好太多所有除非有非常必要的理由,否则很少用;
READ COMMITTED(提交读):
大多数数据库系统的默认隔离级别都是 提交读,但是mysql不是,提交读这一级别,满足前面提到的隔离性的简单定义,一个事物开始时,只能看见已经提交的事务所做的修改,换句话说,一个事务从开始知道提交之前,所做的任何修改都是不可见的,这个级别有时候也叫做不可重复读,因为俩次执行同样的查询,可能会得到不一样的结果;
REPEATABLE READ (可重复度)
这个级别解决了赃读的问题,它确保同一事务的多个实例在并发读取数据时,会看到同样的数据行,保证了同一个事务中多次读取同样的记录结果是一致的,但理论上,可重复读隔离级别还是无法解决另外一个幻读的问题,所谓幻读就是当某个事务在读取某个范围内的记录时,另外一个事务又在该范围内插入了新的记录,当之前的事务再次读取该范围的记录时会产生幻行Innodb和XreaDb存储引擎通过多版本并发控制MVCC解决了幻读的问题
ps:可重复读是mysql的默认事务隔离级别;
SERIAIZABLE(可串行化):这是最高的隔离级别,他通过强制事务串化执行,避免了前面的幻读问题,简单的来说,这个级别会在读取的每一行数据上面都加锁,所以可能导致大量的超时和锁争得问题,实际应用中用的也很少这个隔离级别,只有在非常需要确保数据的一致性时而且可以接受没有并发的情况下,才会考虑这个隔离级别

死锁:死锁是指俩个或者多个事务在同一个资源上相互占用,并请求锁定对方占用的资源,从而导致恶性循环的现象,当多个事务试图以不同的顺序锁定资源时,就会产生死锁
ps:Innodb目前处理死锁的方法是,将持有最少行级排它锁的事务进行回滚(这是相对比较简单的死锁回滚算法)大多数的方法都是只需要重新执行因死锁回滚的事务即可;

赃读:就是指当一个事务正在访问数据,并且对数据进行了修改,而这种修改没有提交到数据库中,这时另外一个事务也访问这个数据然后使用了这个数据;
不可重复读:就是指在一个事务之内,多次读同一数据,在这个事务还没有结束时,另外一个事务也访问该同一数据,那么在第一个事务中的俩次读数据之间,由于第二个事务的修改,那么第一个事务俩次读到的数据可能是不一样的,这也就发生了在一个事务内俩次读到的数据是不一样的,因此称为是不可重复度;
幻读:是指当事务不是独立执行时发生的一种现象,例如第一个事务对一个表中的数据进行了修改,这种修改涉及到表中的全部数据行,同时第二个事务也修改这个表中的数据,这种修改是向表中插入了一行新数据,那么以后就会发生操作第一个事务的用户发现表中还有没有修改的数据行,就好像发生了幻读一样
提醒:不可重复读的重点是修改,同样的条件下,你读取过的数据,再次读取出来发现值不一样了
幻读的重点在于新增或者删除;同样的条件,第一次和第二次读出来的记录数不一样!

mysql的事务型的存储引擎:InnoDB 和 NDB Cluster,Mysql默认采用自动提交模式(AUTOCOMMIT)

多版本并发控制
MySQL的大多数事务类型存储引擎实现的都不是简单的行级锁,基于提升并发性能的考虑,他们一般都同时实现了多版本并发控制(MVCC)
可以认为MVCC是行级锁的一个变种,但是它在很多情况下避免了加锁的操作,因此开销更低,虽然实现机制有所不同,但是大都实现了非阻塞的读操作,写操作也只是锁定了必要的行
MVCC典型的有乐观并发控制和悲观并发控制,他只在可重复读(REPEATABLE READ)和提交读(COMMITTED)俩个隔离级别下工作,其他俩个事务隔离级别和mvcc都不兼容,因为READ UNCOMMITTED未提交读总是读取最新的数据行,而不是符合当前事务版本的数据行,而SERIALIZABLE可串行化则会对所有读取的行都加锁

SHOW TABLE STATUS 查看表的基本信息

InnoDB表是基于聚簇索引建立的,聚簇索引对住建查询有很高的性能,不过他的二级索引(非主键索引)中必须包含主键列

MYISAM 会将表存储在俩个文件中:数据文件和索引文件分别以 MYD 和MYI为扩展名
四个特性 加锁与并发,修复,索引特性,延迟更新索引键;

mysql还有很多特殊用途的存储引擎:
Archive引擎,Blackhole引擎,CSV引擎,federated引擎,Memory引擎,Merge引擎,NDB集群引擎;此外mysql还支持插件式的引擎API,OLTP引擎,面向列的存储引擎,社区存储引擎,
选择一个合适的存储引擎要考虑的四个因素,事务,备份,崩溃修复,特有的特性。

总结mysql拥有分层的架构,上层是服务器层的服务和查询执行引擎,下层是存储引擎。虽然有很多不同作用的插件API,但存储引擎API还是最重要的,如果能理解Mysql在存储引擎和服务层之间处理查询时如何通过API来回交互,就能抓住mysql的核心基础框架的精髓。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值