高性能MySQL第一章笔记

105人阅读 评论(0) 收藏 举报
分类:

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导入数据

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


查看评论

高性能Mysql运维应用实战

-
  • 1970年01月01日 08:00

高性能MySql阅读笔记-第一章

1.Mysql的逻辑架构
  • ya_1249463314
  • ya_1249463314
  • 2018-01-07 17:16:02
  • 127

高性能MySQL 第三版读书笔记 一至六

  • 2013年11月19日 16:29
  • 559KB
  • 下载

《高性能MySQL》第一章

mysql最重要,最与众不同的是存储引擎架构。数据的处理和存储分离。根据性能,特性,需求等选取数据存储方式。 mysql服务器逻辑架构: 第一层:连接处理,授权认证等。 第二层:所有跨存储引擎的功...
  • lijingkuan
  • lijingkuan
  • 2015-09-08 10:06:27
  • 297

mysql高性能扩展_____第三章

常见业务处理 对数据进行分页显示: 执行计划能告诉我们什么: mysql优化器是如何处理sql的请求的 1.如何使用表中的索引的 2.连接查询的执行顺序 3.查询扫描的数据行数...
  • jisngjun
  • jisngjun
  • 2018-01-15 10:17:21
  • 95

《高性能MySQL》 第一章(并发控制、事务、存储引擎)

并发控制(数据库中的表的删除和修改) 问题1: email box中,如果同时投递邮件会发生混乱。 解决: 为了避免会在投递邮件时锁住邮箱,必须等待锁释放才能继续投递。 不足: 任意时刻只...
  • weixin_40475469
  • weixin_40475469
  • 2017-11-27 23:05:47
  • 72

《高性能MySQL》读书笔记(上)

《High Performance MySQL》真是本经典好书,从应用层到数据库到硬件平台,各种调优技巧、常见问题全都有所提及。数据库的各种概念技巧平时都有接触,像索引、分区、Sharding等等,但...
  • dc_726
  • dc_726
  • 2014-12-06 19:31:18
  • 6715

《高性能MySQL》读书笔记--多版本并发控制算法

1.AUTOCOMMITMysql采用默认自动提交,可以通过如下命令查看和修改:mysql> SHOW VARIABLES LIKE 'AUTOCOMMIT';+------------...
  • xifeijian
  • xifeijian
  • 2015-04-25 22:45:21
  • 7278

《高性能MySQL》第四章

由于innodb表索引的特殊性,减小主键大小,会使非主键大小也变的更小。 整数类型 tinyint smallint mediumint int bigint 8       16      ...
  • lijingkuan
  • lijingkuan
  • 2015-09-09 16:15:56
  • 508

《高性能MySQL》读书笔记--查询性能优化

对于高性能数据库操作,只靠设计最优的库表结构、建立最好的索引是不够的,还需要合理的设计查询。如果查询写得很糟糕,即使库表结构再合理、索引再合适,也无法实现高性能。查询优化、索引优化、库表结构优化需要齐...
  • xifeijian
  • xifeijian
  • 2015-05-09 20:34:32
  • 8938
    个人资料
    持之以恒
    等级:
    访问量: 2385
    积分: 629
    排名: 8万+
    文章存档