MySQL逻辑架构视图:

【读书笔记】高性能MySQL (一)


锁策略:1.表锁:将整个表加锁

2.行级锁:可以支持最大的并发处理(同时也带来最大的锁开销)。行级锁由存储引擎实现,而不是由MySQL服务器实现。


事务是一组原子性的SQL查询语句,可以看作是一个工作单元。如果数据库引擎能够成功对数据库应用所有的查询语句,它就会执行所有查询,如果任何一条查询语句因为崩溃或其他原因无法执行,则所有语句都不会执行。

ACID:原子性、一致性、隔离性、持久性

原子性:一个事务必须被视为一个单独的内部“不可分”的工作单元,以确保整个事务全部被执行或全部回滚。

一致性:数据库总是从一种一致性状态到另一种一致性状态。

隔离性:某个事务的结果只有在完成之后才对其他事务可见。

持久性:一旦一个事务提交,事务所做的数据改变将是永久的。


SQL的四种隔离级:

READ UNCOMMITTED 读取未提交内容(脏读)

READ COMMITTED 读取提交内容

REPEATABLE READ 可重读(可能导致幻读) MySQL默认

SERIALIZABLE 可串行化(在每个读的数据行上加锁)


死锁是指两个或多个事务在同一资源上呼吸那个占用,并请求加锁时,而导致的恶性循环现象。当多个事务以不同顺序试图加锁同一资源时,就会产生死锁。


在一个事务中,如果混合使用事务性表和非事务性表,假如事务处理一切顺利,那么结果页正常。但是,如果事务须回滚,那么在非事务性表上做的修改将无法取消。

InnoDB使用二相锁定协议。一个事务执行过程中的任何时候,都可以获得锁,但只有在执行COMMIT或者ROLLBACK语句后,才可以释放这些锁。


InnoDB专为事务处理设计的引擎,特别适用于处理大量短期事务。默认隔离级是REPEATABLE READ。InnoDB表是基于聚簇索引建立的,能提供一种非常快速的主键查找性能。InnoDB不会压缩索引。

InnoDB不能根据排序建立索引,而MyISAM支持。因此当InnoDB加载数据和创建索引时要比MyISAM慢很多。任何改变InnoDB表结构的操作都会导致整个表的重建。

除了高并发处理能力,InnoDB另一个广为人知的特征是它的外键约束。当使用主键时,InnoDB提供了及其快速的查询查找性能。


Memory表比MyISAM表快一个数量级,所有数据都在内存中,一旦系统重启,内存表结构仍然会保留,但原有的相关数据将会丢失。

内存表的几个用途:用于“查找”或“映射”表;用于缓存周期性聚合数据;用于在数据分析中产生的中间结果。

内存表采用表级加锁,只支持较低的写并发。

Achieve引擎只支持INSERT和SELECT查询而不支持索引。因为缓冲了数据写操作,并在插入时使用zlib算法对每行数据进行压缩,因此磁盘I/O消耗更少。基于此引擎的任何SELECT查询都会导致全表扫描。Achieve表适用于数据记录和数据采集的应用。

Achieve引擎支持行级加锁和专用的缓冲区系统,因而实现高并发的数据插入。


MyISAM表比InnoDB表更容易出错,恢复所需的时间也更长。


 

【读书笔记】高性能MySQL (一)


表转换:

ALTER TABLE

DUMP and IMPORT

CREATE and SELECT