[toc]
与其他数据库系统相比,MySQL的架构可以在多种不同场景中应用并发挥好的作用。MySQL既可以嵌入到应用程序中也可以支持数据仓库、内容索引和部署软件、高可用的冗余系统、在线事务处理系统(OLTP)等各种应用类型。
MySQL架构
逻辑架构
MySQL的存储引擎架构将查询处理
及其他系统任务和数据的存储/提取相分离
。
{ % asset_img mysql_1.png %}
MySQL在存储引擎和服务层之间吹查询时如何通过API来会交互
并发控制
在处理并发读或写时,可以通过实现一个或两种类型的锁组成的锁系统来解决。
共享锁(读锁):
读锁是共享的,或者说是相互不阻塞的,多个客户在同一时刻可以同时读取同一个资源,而互不干扰。
排他锁(写锁):
写锁是排他的,也就是说一个写锁会阻塞其他的写锁和读锁。
锁粒度:
在选择封锁粒度时,需要在锁开销和并发程度之间做一个权衡——应该尽量只锁定需要修改的那部分数据,而不是所有的资源,锁定的数据量越少,发生锁争用的可能就越小,系统的并发程度就越高
;但是加锁需要消耗资源,锁的各种操作都会增加系统开销,因此锁粒度越小,系统开销越大
。
锁策略:
表锁:最基本、开销最小的策略,会锁定整张表;
行级锁:最大程度地支持并发处理,最大的锁开销,只在存储引擎层实现,MySQL服务器层没有实现
。
存储引擎
InnoDB是MySQL的默认事务型引擎,也是最重要、使用最广泛的存储引擎;
MySQL 5.1 及之前的版本,MyISAM是默认的存储引擎;MyISAM不支持事务和行级锁
MySQL索引
索引(在MySQL中也叫做“键”)是存储引擎
用于快速找到记录的一种数据结构;索引可以包含一个或多个列的值,如果索引包含多个列,那么列的顺序也十分重要,因为MySQL只能高效地使用索引的最左前缀列
。
优点:
- 减少查询需要扫描的数据量(加快了查询速度)
- 减少服务器的排序操作和创建临时表的操作(加快了groupby和orderby等操作)
- 将服务器的随机IO变为顺序IO(加快查询速度).
缺点:
首先索引也是数据,需要存储,因此会带来额外的存储空间占用;其次,在插入、更新和删除操作的同时,需要维护索引,因此需要带来二外的时间开销。
- 索引占用磁盘或者内存空间
- 减慢了插入更新操作的速度
类型:
由索引的定义可以看出索引是交给存储引擎去实现的
,而MySQL支持多存储引擎,所以不同的存储引擎实现的索引类型不太一样。
B-树索引/B+树索引:
中间节点不保存数据
,那么就可以保存更多的索引,减少数据库磁盘IO的次数
;中间节点不保存数据
,所以每一次的查找都会命中到叶子节点
,而叶子节点是处在同一层的
,因此查询的性能更加稳定
;- 所有的
叶子节点按顺序链接成链表
,因此方便进行范围查询
。
哈希索引
空间数据索引
全文索引
MySQL查询
MySQL查询特别慢:
MySQL事务
事务——一组原子性的SQL查询,或者说一个独立的工作单元;事务内的语句,要么全部执行成功,要么全部执行失败;
ACID特性、四种隔离级别
存储
datetime 和timestamp
类型 | 占据字节 | 表示形式 | 表示范围 | |
---|---|---|---|---|
datetime | 可以为NULL | 8(与时区无关) | yyyy-mm-dd hh:mm:ss | ‘1000-01-01 00:00:00.000000’ to ‘9999-12-31 23:59:59.999999’ |
timestamp | 当前时间到Unix元年(1970-01-01 00:00:00)的秒数,不可以为NULL,自动存储当前时间 | 4(以UTC格存储) | yyyymm-dd hhmmss | ‘1970-01-01 00:00:01.000000’ to ‘2038-01-19 03:14:07.999999’ |