高性能MySQL第一章笔记

1.MYSQL服务器逻辑架构图


每个客户端连接都会在服务器中拥有一个线程。

2.并发控制
(1)处理并发读写时,可以通过实现由两种类型的锁组合的锁系统来完成,一般称为共享锁和排它锁,也被称为读锁和写锁。读锁是共享的,不影响其他人的读或写,写锁则会阻塞其它的读锁或写锁。
锁粒度:最理想的方式是只锁定需要修改的部分数据。
锁策略:大量锁会造成系统开销,在开销和安全之间寻找平衡,就是所谓锁策略。
每种MYSQL引擎都能实现自己的锁粒度和锁策略,以便更好的适应各种场景。

锁策略:
(1)表锁:是MYSQL最基本的锁策略,是开销最小的锁,在非读操作时,它会锁定整张表。
(2)行级锁:能最大程度的支持并发处理,但是开销最大,在InnoDB和XtraDB等引擎中实现了行级锁。


3.事务与ACID
(1)事务内的语句,要么全部执行成功,要么全部失败。
(2)一个运行良好的事务系统,必须具备ACID,分别为原子性,一致性,隔离性,持久性。
       1.原子性:一个事务必须被视为一个最小的操作单元,要么全部成功,要么全部失败,不能只执行一部分。
       2.一致性:数据库总是从一个一致性状态到另一个一致性状态。
       3.隔离性:一个事务在最终提交之前,对其他事务通常是不可见的,中间状态在提交前不会显示。
       4.持久性:一旦事务提交,所做的修改会永远保存到数据库中。
事务和ADID特性虽然能保证安全,但是也会做更大的开销,如同并发控制一样,这里就可以通过选择MYSQL的储存引擎来选择是否需要事务。

3.1隔离级别:
READ UNCOMMITED 未提交读:事务未提交也可见,问题很多,一般不使用。
READ COMMITED 提交读:解决了脏读,提交了的事务才可见,大多数数据库(Oracle)的默认隔离级别。
REPEATABLE READ可重复读:解决了不可重复读问题,未解决幻读问题,MYSQL的默认级别。
SERIALIZABLE可串行化:最高隔离级别,解决了幻读,每一行都会加锁,消耗很大,一般少用。

脏读:

脏读又称无效数据读出。一个事务读取另外一个事务还没有提交的数据叫脏读。

例如:事务T1修改了一行数据,但是还没有提交,这时候事务T2读取了被事务T1修改后的数据,之后事务T1因为某种原因Rollback了,那么事务T2读取的数据就是脏的。

解决办法:把数据库的事务隔离级别调整到READ_COMMITTED

不可重复读:不可重复读重点在于修改

不可重复读是指在同一个事务内,两个相同的查询返回了不同的结果。 
例如:事务T1读取某一数据,事务T2读取并修改了该数据,T1为了对读取值进行检验而再次读取该数据,便得到了不同的结果。 解决办法:把数据库的事务隔离级别调整到REPEATABLE_READ

幻读:幻读的重点在于插入和删除

例如:系统管理员A将数据库中所有学生的成绩从具体分数改为ABCDE等级,但是系统管理员B就在这个时候插入了一条具体分数的记录,当系统管理员A改结束后发现还有一条记录没有改过来,就好像发生了幻觉一样。这就叫幻读。

解决办法:把数据库的事务隔离级别调整到SERIALIZABLE_READ



3.2死锁:
当两个或多个事务在同一资源上互相占用,锁定资源时,容易产生死锁。死锁是事务型系统不可避免的,大部分情况只要重新回滚一个产生死锁原因的事务即可。InnoDB是将拥有最少行级写锁的事务进行回滚。


3.3 MYSQL中的事务
MYSQL的事务型引擎有:InnoDB和NDB Cluster
MYSQL默认采用自动提交AUTOCOMMIT,也就是说,不是显示的开始一个事务,则每个查询都会被当作一个事务执行提交操作。通过SET AUTOCOMMIT = 1 or 0
设置隔离级别:SET SESSION TRANSACTION ISOLATION LEVEL XXX;



4.多版本并发控制
MYSQL大多数事务型储存引擎都不是简单的行级锁,一般都实现了多版本并发控制(MVCC),MVCC是行级锁的一种,但是它在很多情况下避免了加锁操作,开销更低,实现了非阻塞的读操作,写操作也只要锁定必要的行。
InooDB的MVCC是通过在每行记录后面保存两个隐藏列来实现的,一列保存创建时间,一列保存过期时间。
MVCC在可重复读级别下的具体操作:



5.引擎
    书上介绍了以InnoDB为首的很多种引擎,最后结论是,除非需要用到InnoDB没有的特性,都应该优先选择InnoDB,一般不建议混合使用多种引擎。 选择引擎一般需要考虑的问题:事务,备份,崩溃恢复,特有特性。MyISAM引擎可能在有些情况比InnoDB快,但是数据恢复和其他问题很多需要考虑清楚。

5.1 转换引擎的三种方法:
(1)ALTER TABLE  表名 ENGINE = InnoDB; 耗时长,消耗系统I/O能力,原表上读锁。
(2)导出与导入:用mysqldump将数据导出到文件,修改文件中CREATE TABLE,修改表名。不注意容易导致数据丢失
(3)创建与查询(CREATE和SELECT)是最好的方法,先创建一个储存引擎的表,然后用INSERT SELECT导入数据

如果数据量较大,则可以进行分批处理


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值