从SQL Server到MySql(1) : MySql 基础知识篇

用了多年的SQL Server 后, 最近开始转用Mysql 作为主要的数据库. 此系列文章记录了此间学到了知识和经验.

作为开篇, 首先介绍的是MySql 的一些基础知识.

1. MySql 逻辑架构

MySq 存储引擎最与众不同的特性是它的存储引擎架构. 这种架构将查询处理(Query Processing) 以及其它系统任务(Server Task)和数据的存储/提取 进行了分离.

这样存储和处理相分离的设计, 可以在使用时根据性能,特性,以及其它需求来选择数据存储的方式.

例如, 可以主表使用InnoDB, 而用MyISAM作为缓存表的引擎, 将会得到更小的索引暂用空间, 并且可以做全文搜索.

从逻辑上, MySql 架构分为三层: 连接/线程处理层; 核心服务层; 存储引擎.

1.1 连接/线程处理层

类似大多数基于网络的C/S 工具或服务. 盖层主要负责连接处理, 授权认证, 安全等等.

每个客户端连接在服务器进程中拥有一个线程. 服务器会负责缓存线程, 从而不需要频繁新建销毁.

1.2 核心服务层

包含查询解析, 分析, 优化, 缓存以及所有的内置函数.

该层同时实现了所有跨存储引起的功能: 存储过程, 触发器, 视图等.

1.3 存储引擎

  • 负责数据的存储和提取.
  • 除了InnoDB会解析外键定义(因为MySql 服务器本身没有实现) 外, 存储引起不会去解析SQL.
  • 核心服务层通过存储引擎API与存储引擎通信. 该API使得不同存储引擎的差异对上层的查询过程透明.
  • 不同的存储引擎间, 不会互通信, 而只是简单地响应上层服务器的请求.

2 并发控制时的锁

  • 锁粒度的选择, 是在锁的开销和数据的安全性之间寻求平衡.
  • 多数数据库会在表上施加row-level 锁, 并采用手段保证锁较多时的性能.
  • MySql 每种存储引擎都可以实现自己的锁策略和锁粒度.

3 MySql 中的事务

  • MySql 提供了两种事务型的存储引擎: InnoDB和NDB Cluster.
  • MySql 默认采用自动提交(AutoCommit)模式. 若不是显式地开始一个事务,则每个查询都被当做一个事务执行提交操作.
  • 对于MyISAM或内存表, 没有Commit 或Rollback 的概念. 相当于一直处于AutoCommit 模式.
  • 有一些命令, 在执行之前会强制执行Commit 提交当前的活动事务. 典型的例子, 在DDL中, 如果是会导致大量数据改变的操作, 如Alter Table, Lock Tables.
  • MySql 服务层不管理事务, 事务由下层的存储引擎实现. 如果在同一事务中,使用多种存储引擎是不可靠的.

3.1 隐式和显式锁定

  • InnoDB采用的是两阶段锁定协议. 在事务执行过程中, 随时都可以执行锁定. 锁只有在执行Commit 或者RollBack 时才会在同一时刻释放.
  • InnoDB 会根据隔离级别在需要时自动加锁.
  • 另外,也支持 Lock tables 和UnLock Tables语句来进行显式加锁.
  • 并且, MySql 在服务层也实现了Lock tables 和UnLock Tables的支持. 但并不能替代事务处理. 如需用到事务, 还是应该选择事务型存储引擎.

3.2 事务日志

  • 存储引擎在修改表数据时, 只需修改其内存拷贝, 再把该修改行为记录到持久在硬盘上的事务日志中, 而不用每次都将修改数据本身持久到硬盘.
  • 采用追加的方式. 写日志是磁盘上一小块区域内的顺序I/O, 速度更快.
  • 日志持久化后, 内存中修改的数据, 在后天慢慢地刷回硬盘.

事务日志也被成为预写式日志(Write-Ahead Logging). 修改数据需要两次写磁盘.
若在数据还未写回磁盘时崩溃, 会在重启后自动修复该部分修改的数据.

3.3 多版本并发控制(MVCC)

  • 通过保存数据在某个时间点的快照来实现.
    • 在每行记录上保存两个隐藏的列, 行的创建时间和过期(删除)时间. 时间值是系统版本号.
    • 每开始一个事务, 系统版本号递增.
    • 事务开始时刻的系统版本号作为事务的版本号, 用来和查询到的每行记录的版本号进行比较.
  • 使多数读操作不需要加锁. 但需要额外的空间和检查工作.
  • 对隔离级别的支持.
    • 只支持Repeatable Read和Read Committed隔离级别.
    • Read unCommitted 总读取最新的数据, 而不是当前事务版本的数据行.
    • Serialisable 会对所有读取的行都加锁.

4 MySql 存储引擎

4.1 存储

  • MySql 使用文件系统的目录和文件保存数据库(Schema)和表的定义.
  • 库是数据目录的子目录.
  • 表会有同名.frm文件保存表的定义.
  • 所以, 大小写敏感性和具体的平台密切相关.

4.2 InnoDB

  • 数据存储在表空间(tablespace)中, 表空间是由InnoDB管理的黑盒子, 由一系列的文件组成.
  • 采用MVCC 来支持高并发. 并且实现了四个标准的隔离级别.
  • 表基于聚族索引建立的. 对铸件查询有很高的性能, 但是二级索引中必须包含主键列. 所以主键列应尽可能的小.
  • 适合场景: 处理大量的短期事务(多数情况下正常提交,很少被回滚), 支持自动崩溃恢复.

4.3 MyISAM

  • 提供了全文检索,压缩,空间函数等特性.
  • 不支持事务和行级锁. 且无法做到崩溃后恢复.
    • 加锁与并发. 读取时对表加共享锁, 写入时对表加排它锁.
  • 适合场景: 对于只读数据, 或者表比较小, 能够忍受修复操作.
  • 引擎选择的因素: 事务, 备份, 崩溃恢复, 特有的特性.
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,529评论 5 475
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,015评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,409评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,385评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,387评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,466评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,880评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,528评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,727评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,528评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,602评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,302评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,873评论 3 306
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,890评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,132评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,777评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,310评论 2 342

推荐阅读更多精彩内容