Mysql的质量比较好的书其实并不是很多,所以可以说是看一本少一本,这本书也算是学习MYSQL必看的一本书,当然十分厚,虽然版本很老但是讲述的内容都会十分实用的,对于学习MYSQL的人可以说是一本必读的进阶好书。
最后,这篇读书笔记是整理个人以前自学的时候看书做的笔记,做的十分粗糙=-=,现在来看很多笔记记得过于基础了。另外当时很多都是截图的,很多都是图片HHHH(流量观看慎重)。
虽然看上去比较复古,但是挺经典的。
❝「小贴士:」 存储引擎不会去解析sql, 不同存储引擎不会相互通信,只是简单响应上层请求(「InnoDB引擎除外,会解析外键定义,因为mysql服务器本身没有实现该功能」) ❞
每一个连接都是一个单独线程,服务器会对连接「缓存」而不是创建或者销毁线程
执行流程:
目的:内部拥有锁机制防止数据破坏
提高共享资源并发性就是让锁更有选择性,让锁只监控部分数据
记住:「任何时候,给定资源下,锁定数据量越少,并发程度越高,只要相互不发生冲突即可」
mysql提供多个存储引擎支持丰富的锁策略
表锁是msyql中最基本的锁策略,开销最小的策略,这种方式类似邮箱的加锁机制:会锁定整张表,用户访问时候,对表进行写操作,需要优先获得写锁,会阻塞其他用户读写操作,「只有没有写锁时候,其他用户才能获得读锁」,读锁之间是不相互阻塞的,特定场景表锁可以有良好性能。
注意事项:
该锁可以「最大程度支持」并发处理(与此同时带来巨大锁开销),「InnoDB」和「XtraDB」, 实现了行级锁,行级锁只在存储层也就是存储引擎实现,而mysql服务层没有实现
事务使用与否根据实际业务情况而定(甚至可以不使用事务,而是使用sql 进行一定的安全措施),如何选择合适的 mysql 引擎来解决问题可能事务本身更加重要。
如果多个线程同时更改同一行数据,你们两个线程互相等待对面的锁,造成死锁
❝只有部分或者完全回滚一个事务才能打破死锁,事务性系统无法避免。「大多数时候只需要重新执行死锁事务即可」 ❞
事务日志采用追加方式,因此I/O的消耗比较小,内存修改数据后台慢慢刷会磁盘,目前大多数存储引擎都是这样实现被称为:「预写式日志」
默认情况下我们所写的SQL默认都是自动提交的,也就是说在执行的时候MYSQL都会给我们自定加上一条,COMMIT语句,也就是自动提交事务,我们可以使用SHOW VARIABLES LIKE 'AUTOCOMMIT'
语句查看是否开启自动提交。
切记:查找对应版本会产生 「AUTO_COMMIT」 所有语句
命令如下:
> SET SESSION TRASACTION ISOLATTION LEVEL READ COMMITTED
mysql 可以识别 4 个 ansi 隔离级别,innodb 引擎也支持
mysql 服务层不管理事务,事务下层存储引擎实现,同一个事务使用多种存储引擎不可靠
「mysql 对非事务型表不会有提示!!!!」
「mysql 对非事务型表不会有提示!!!!」
「mysql 对非事务型表不会有提示!!!!」
记住下面的两条特点:
innodb支持显示的加锁如下:
SELECT ... FROM IN SHARE MODE
SELECT ... FOR UPDATE
❝注意:这不是sql规范,而是MYSQL自己增加的语法支持 ❞
mysql 中的「lock 和 unlock tables 语句和存储引擎无关」,而是在**服务层**实现,「不能用来替代事务性存储引擎」,有其他用途
❝建议:除了事务中禁用autocommit ,可以使用lock tables 之外,其他任何时候不要显式执行 lock tables,不管是什么存储引擎 ❞
mvcc实现:保存数据在某个时间点的快照实现,记住:根据事务开始时间不同,每个事务对同一张表,同一时刻看到的数据可能是不一样的,这里可以引申:「悲观锁」和「乐观锁」
实现原理:通过在每行记录后面保存两个隐藏的列实现
事务开始时候系统版本号(每个新事务都会递增版本号)作为事务版本号,和查询到记录的版本号比较
REPEATABLE READ 隔离级别操作
MVCC 只在 「REPEATABLE READ」 和 「READ COMMITTED」 两个隔离级别工作。
mytable.frm
中定义表定义。 使用show table status
命令 显示表的相关信息,例如 show table status like 'user' \G
,mysql5.1中的innodb plugin
支持一些新特性(BLOB存储方式使用),mysql5.1一定要使用 innodb plugin ,比 旧innodb要好得多
❝mysql 5.5 之后 innodb plugin 才替换掉旧的 Innodb ❞
❝聚簇索引 对于主键查询有非常高的性能,不过二级索引中必须包含主键列,「如果主键列很大,其他所有索引都会很大」, ❞
mysql5.1 之前默认使用 MyISAM 作为存储引擎
将表存储在两个文件当中
如果表中数据不再修改,可以使用myisam 压缩表,作用是减少磁盘i/o, 提高查询性能。
最典型的性能问题是 「表锁」 的问题
除非使用到了innodb 不具备的特性,并且无法替代,否则优先选择innodb
主要看待四点
❝测试崩溃数据恢复问题就是模拟电源断电!!! ❞
mysql> ALTER TABLE mytable ENGINE = InnoDB
这种方式性能很低,而且会加锁
导入与导出:使用msyql 工具导出sql 语句然后手动修改引擎
mysql > create table innodb_table like myisam table;
mysql > alter table innodb_table engine = InnoDB;
mysql > insert into innodb_table select * from myisam_table
start transaction;
insert into innodb_table select * from myisam_table
where id between x and y;
insert into innodb_table select * from myisam_table
where id between x and y;
insert into innodb_table select * from myisam_table
where id between x and y;
.......
commit
第一篇读书笔记主要介绍了和MYSQL的存储引擎的重点内容,以及简单介绍MYSQL 的事务相关内容,在前言也说过,内容比较基础并且由于以前偷懒很多都是截图书上的内容=-=。