mysql最与众不同的是他的存储引擎架构
mysql逻辑架构
mysql服务器的逻辑架构分为三层:1、客户端 2、服务器:包括线程处理、查询缓存、解析器、优化器 3、存储引擎,服务器通过api和存储引擎连接,存储引擎负责数据的存储与提取
1 连接管理与安全性
每个客户端连接到服务器后会拥有一个线程,查询之类的操作都是在这个线程里进行,服务器可以缓存线程,拥有线程池
2 优化与执行
服务器会根据查询去解析、优化、执行这个语句,但在这之前会去缓存找这个查询,如果有直接从缓存里返回结果,在优化的过程中,可以通过一些关键字来影响优化过程,优化包括重写查询、决定表的读取顺序,通过explain可以查看优化的各个具体因素。优化器在优化之前会要求储存引擎提供一些信息,比如容量或某个操作的开销信息以及表数据的统计信息。
并发控制
mysql在两个层面的并发控制:服务层和存储引擎层
1 读写锁
也叫共享锁和排他锁,上了共享锁的数据可以被别的线程读取,但不能写,上了排他锁的数据不能被别的线程读取和写。
2 锁粒度
因为锁的管理也要消耗资源,例如获得锁、检查锁是否被释放、释放锁,都会增加系统的开销,锁策略就是在锁的开销和安全性中间找一个平衡,一般商业数据库都是用行级锁,并且实现很复杂。
表锁:锁住一张表。开销很小。存储引擎管理自己的锁,但MySQL也可以使用表锁,例如为alter table加表锁,忽略存储引擎的锁机制,
行级锁:最支持并发处理,但锁消耗最大。只有存储引擎中能实现行级锁。
事务
事务是具有原子性的一系列操作。
Start transaction开始,commit提交,rollback回滚,良好的事务必须满足ACID:A是原子性,即事务里的操作要么都执行,要么都不执行。C:一致性:从一种一致性状态变成另外一种一致性状态。I:隔离性:一个事务对于另一个事务是不可见的。D:持久性:事务提交后会被永久保存在数据库里。
1 隔离级别
Read uncommited:未提交也可读,会出现脏读
Read commited:提交才能读,会出现不可重复读
Repeatable read:可重复读,会出现幻读,mysql默认的隔离级别
Serializable:
2 死锁
两个或两个以上的事务争夺同一资源同时要求锁定对方的资源。
有死锁检测和死锁超时机制。Innodb目前的策略是将持有行级排他锁最少的事务进行回滚。
3 事务日志
修改表的时候只需要修改其内存拷贝,然后把修改行为记录到硬盘里的事务日志上。是磁盘内部的顺序IO。
预写式日志:日志持久化后,内存中的数据可以在后台慢慢的刷回磁盘。
4 mysql中的事务
autocommit:开启的时候每条查询都视为一个日志
事务由存储引擎实现的。
Lock tables和unlock tables不能代替事务。
innodb根据隔离级别在需要的时候自动加锁。
多版本并发控制
innodb的MVCC是在每行记录后面加两个隐藏列,一个列保存行的记录时间,一个是保存过期(删除)时间。
在repeatable read隔离级别中,mvcc的操作如下:
select的时候,只能查询满足:1、改行的记录时间小于等于当前事务版本同时删除时间大于当前事务版本号的行记录。
insert的时候,把当前事务版本号设置为该行的记录时间
delete的时候,把当前事务版本号设置为该行的删除时间
update的时候,把当前事务的版本号设置为新纪录的记录时间,同时设置为原来行的删除时间。
通过MVCC可以将大多数读操作不用加锁,但是会消耗额外空间以及需要做更多行检查的操作。
mysql存储引擎
1 innodb存储引擎
支持mvcc,innodb通过间隙锁防止幻读。
innodb使用聚簇索引。
存储格式是平台独立的。
2 myisam存储引擎
把表存储在两个文件里,数据和索引结构
Delayed key write
3 mysql里的其他索引
archive索引:只支持insert和select操作,支持行级锁,有专用的缓存区。
Memory:支持hash索引,找的快,一般临时表用memory
4 转换表的引擎
Alter table
用mysqldump把数据导入导出
创建与查询