Fork me on GitHub

读薄《高性能MySql》(一)MySql基本知识

读薄《高性能MySQL》(一)MySQL基本知识
读薄《高性能MySQL》(二)Scheme与数据优化
读薄《高性能MySQL》(三)索引优化
读薄《高性能MySQL》(四)查询性能优化

高性能 Mysql 的读书笔记。因为这本书写的实在是太好了,即使只是随便翻一下都让人受用无穷。于是写下读书笔记加深印象,也方便没空读这本书的人粗略读一下这本书。

Mysql 的并发控制

读写锁

因为并发的读取数据并不会出现问题,但是并发的读写或者并发写写操作就会出现问题了,所以在并发处理的时候如果将读操作也加上锁那么就浪费了资源。

这时候就引入了共享锁和排他锁来解决这个问题。它们也叫做读锁和写锁。相当于 Java 并发包中的 ReadWriteLock。

锁粒度

尽量减小锁的粒度锁定有利于增加并发量,但是加锁的粒度越小,加锁开销越大。

行锁:并发粒度小,加锁开销大,最大程度增加了并发处理

表锁:锁定整张表,加锁开销小

事务

事务的特性

事务有 ACID 几个特性

Atomicity 原子性

原子性任务是一个独立的操作单元,一个事务要么全部提交成功,要么全部失败回滚。

Consistency 一致性

数据库总是从一个一致性的状态转移到另外一个一致性的状态。当事务失败的时候它所作出的修改也不会保存到数据库中。

Isolation 隔离性

一个事务所做的修改在提交前对其他的事务是不可见的。

Durability 耐久性

一旦一个事务提交,所做的修改就会永久保存到数据库中。

并发一致性问题

脏读:一个事务读到了其他事务未提交的数据

不可重复读:事务 A 第一次读取到 row1,然后有事务 B 提交修改后,事务 A 再次查询到这一行,但是内容不一样

幻读:事务A第一次查询得到一行记录row1,事务B提交修改后,事务A第二次查询得到两行记录row1和row2。

隔离级别

SQL 定义了四种隔离级别,每一种级别规定了一个事务中所做的修改,哪些修改在事务内和事务间是可见的。

级别低的可以执行更高的并发,系统开销也低。

READ UNCOMITED(未提交读)

在这个级别中,事务的修改即使没有提交对其他的事务也是可见的。这样会导致脏读问题,从性能上来说,它也不会比其他的好很多,所以一般不用

READ COMMITED(提交读)

大多数数据库默认隔离级别都是这个(Mysql 不是),一个事务开始的时候只能看见已经提交过的事务。这个级别也叫做不可重复读。

REPEATABLE READ(可重复读)

它是 Mysql 的默认事务隔离级别。这个级别保证了同一个事务中多次读取同样的记录结果是一致的,但是解决不了幻读问题。

SERIALIZABLE(可串行化)

这个事务执行级别最高,避免了幻读的问题,在每一个数据上都加上锁,可能会导致大量的锁争用的问题。这个级别也很少用。

MYSQL 相关特性

Mysql 默认使用的是自动提交,如果不显式地开始一个事务,所有的查询都会被当做一个事务提交。

可以通过设置 AUTOCOMMIT 变量来启动或者禁用自动提交。

当然对于 MyISAM 这类没有事务概念的引擎,这个是一直启用的。

Mysql 中的事务型存储引擎都不是简单的行锁,它们一般都实现了多版本的并发控制 MVCC,可以简单的认为 MVCC 是行锁的一个变种。

如何选择合适的存储引擎

其实如果根据书上的话来总结,就是这一幅图

posted @ 2018-11-19 21:36  zjmeow  阅读(699)  评论(3编辑  收藏  举报