第一章 mysql架构和历史
- mysql最重要最与众不同的是它的存储引擎架构,这种架构设计将查询处理,以及其他系统任务和数据的存储和提取相分离。
- 存储引擎负责MySQL中数据的储存和提取。
- 每个客户端连接都会在服务器进程中拥有一个线程,这个连接的查询只会在这个单独的线程中进行。
- 对于select语句,在解析查询之前,服务器会先检查查询缓存。
- 一种提高共享对象并发性的方式就是让锁定对象更有选择性,但是增加锁的数量也会增加系统开销,需要在锁的开销和安全性之间寻求平衡。
- mysql有两种锁策略,表锁和行锁。
- ACID:原子性,一致性,隔离性,持久性。
- 四种隔离级别:未提交读(事务中的修改对其他事务可见),提交读(一个事务如果提交了,就能读到他的数据修改),可重复读(保证了同个事务在读取同个数据是一致的,就算这个数据被其它事务修改了,但是无法解决范围查询中读取到新行),串行操作
- innodb发现事务中有死锁的循环依赖时会立即返回错误,如果持有锁的超时了,就会将持有最少行级排它锁事务进行回滚。
- 事务日志可以帮助提高事务的效率。存储系统在修改表数据的时候,只需要修改内存拷贝,再该修改行为写入事务日志中持久化,事务日志持久化之后,再把内存中修改的数据慢慢刷到磁盘里,修改数据需要写两次磁盘。
- MySQL默认使用的自动提交模式,可以设置的。
- MySQL服务器层是不管理事务的,事务是靠存储引擎实现的,所以在一个事务中使用多种存储引擎是不可靠的。
- MySQL也可以显式锁定,但是基本很少用。innodb更不推荐用。
- Innodb的MVCC(多版本并发控制),是通过在每行数据后面保存两个隐藏的字段,保存版本号和删除版本号实现的。select操作只会读取到小于等于当前事务的创建时间,删除时间在事务之前的。insert会保证插入的行带有该事务的版本号。delete会写入删除版本号。UPDATE会新增一条记录,保存新版本,给老记录表示删除版本号。通过这个方法可以使大多数读操作不用加锁,也符合可重复读的隔离标准,但是需要而外的空间。
- innoDB表是基于聚簇索引建立的,聚簇索引对主键查询有很高的性能,不过二级索引必须含有主键列,如果主键很大的话,其它所有的索引都会很大。
- MyISAM不支持事务,不支持崩溃后的安全恢复,加锁是表锁
- 一般情况下InnoDB是最好的选择,从事务,备份,崩溃恢复和特有特性去分析。如果你真的很在意innodb空间占用比较大,也可以考虑其它的。








网友评论