《高性能MySQL》第一章

mysql最重要,最与众不同的是存储引擎架构。数据的处理和存储分离。根据性能,特性,需求等选取数据存储方式。


mysql服务器逻辑架构:
第一层:连接处理,授权认证等。
第二层:所有跨存储引擎的功能,如查询解析,分析,优化,缓存,内置函数,存储过程,函数,触发器等。
第三层:存储引擎层,负责数据的存储和提取。服务器通过API与存储引擎通信,屏蔽了不同存储引擎之间的差异,使得这些差异对上层的查询过程透明。


查询解析---》优化---》执行


select语句,解析查询之前,会检查查询缓存。


表锁:
写锁比读锁有更高的优先级,因此一个写锁请求可能会被插入到读锁队列的前面。
反之,读锁不能插入到写锁前面。
存储引擎层和mysql服务器层都实现表锁,但有不同的目的。


行锁:
最大程度支持并发处理。
行级锁只在存储引擎层实现。




可重复读不能解决幻读的问题。mysql的默认隔离级别是可重复读,但innodb引擎通过MVCC解决了幻读的问题。


解决死锁问题:死锁检测,死锁超时机制。
innodb引擎会将持有最少行级排它锁的事务进行回滚。


事务日志:write-ahead logging,预写式日志。修改数据需要写两次磁盘(日志,数据)。


mysql默认采用自动提交模式autocommit


有些命令会强制commit,如DDL命令。


mysql服务器层不管理事务,事务是由下层的存储引擎层实现的。


innodb引擎支持所有的隔离级别
可以修改数据库或当前会话的隔离级别,如:  set session transaction level read committed;


最好不要在同一事务中使用不同事务型的表,回滚时会有问题。mysql不会发出提醒或报错。


innodb采用两阶段锁定协议


mysql也支持lock table和unlock tables语句,这是在服务器层实现的,与存储引擎无关。(但是建议不要使用lock tables)


MVCC通过保存数据在某个时间点的快照来实现。
innodb的mvcc,是通过在每行记录后面保存两个隐藏列来实现的。一个是行的创建时间,一个是行的过期时间。不是实际的时间值,而是系统版本号。
事务开始时刻的系统版本号,作为事务的版本号。


mysql使用文件系统的目录和文件,来保存数据库和表的定义。数据库对应文件夹,表的定义对应.frm文件。类Unix大小写敏感。windows不敏感。
不同的存储引擎保存数据和索引的方式不同,但表的定义则是在mysql服务器层统一处理的。


innodb的数据存储在表空间中。表空间由一系列的数据文件组成。
innodb通过间隙锁策略防止幻读的出现,间隙锁使得innodb不仅仅锁定查询涉及的行,还会对索引中间的间隙进行锁定,以防止幻影行的插入。
innodb的表时基于聚簇索引建立的。
innodb的非主键索引中,必须包含主键列???
innodb引擎支持热备份,mysql的其他存储引擎不支持热备份。


myisam不支持事务,崩溃后无法安全恢复。但对于只读的数据,性能好。
myisam将表存储在两个文件中:数据文件和索引文件。.MYD和.MYI为扩展名。
myisam只有表锁,没有行锁。但是读取表的过程中,加共享读锁时,可以往表中插入新数据。
myisam只将数据写到内存中,然后等待操作系统定期将数据刷出到磁盘,所以不能保证将数据安全的写入磁盘,崩溃之后恢复是个大问题。


memory引擎
如果mysql在执行查询的过程中需要使用临时表来保存中间结果,内部使用的表就是memory表。


xtradb引擎是基于innodb引擎的一个改进版本。


转换表的引擎三种方法:
1.alter table,执行时间长,一行行的将数据从源表复制到新表中。IO很大。源表加读锁。
2.导入导出,mysqldump。
3.create table ... engine=innodb ,然后insert into ... select ......。如果有必要,在执行的过程中可以对源表加锁,保证数据一致。



你可能感兴趣的:(《高性能MySQL》第一章)