关系型数据库相关知识

关系型数据库和非关系型数据库的区别

在关系型数据库中,数据存储于一张张固定行列的表中;而非关系型数据库中,数据有文档、键值对、图、宽列等多种存储方式。

MySQL数据库

MyISAM和InnoDB存储引擎的区别

  1. MyISAM只能支持表级锁,InnoDB可以支持行级锁和MVCC;
  2. MyISAM不支持事务,InnoDB支持事务;
  3. MyISAM不支持数据库异常崩溃后安全恢复,InnoDB支持;
  4. 索引实现不一样;
  5. InnoDB在多核情况下读写能力呈线性增长;
  6. InnoDB支持外键(感觉无关紧要,毕竟现在尽量不用外键了)

事务

事务是逻辑上的一组操作,要么都执行,要么都不执行
用事务的原子性隔离性持久性来保证数据的一致性

并发事务带来的问题

  1. 脏读
  2. 丢失更改
  3. 不可重复读
  4. 幻读

并发事务的控制方式

通过或者MVCC来避免并发事务带来的问题。

  1. 共享锁:读锁,事务在读取记录的时候获取共享锁,允许多个事务读取时也获取;
  2. 排他锁:写锁/独占锁。
MVCC(多版本并发控制方法)

对一份数据会存储多个版本,通过事务的可见性来保证事务能看到自己应该看到的版本。
MVCC 在 MySQL 中实现所依赖的手段主要是: 隐藏字段、read view、undo log。

事务隔离级别

  1. 读取未提交
  2. 读取已提交
  3. 可重复读
  4. 可串行化

索引

常见索引列建议

  • 出现在 SELECT、UPDATE、DELETE 语句的 WHERE 从句中的列
  • 包含在 ORDER BY、GROUP BY、DISTINCT 中的字段
  • 不要将符合 1 和 2 中的字段的列都建立一个索引, 通常将 1、2 中的字段建立联合索引效果更好
  • 多表 join 的关联列

如何选择索引列的顺序

  • 区分度高的放到联合索引的最左侧
  • 字段长度小的放到联合索引的最左侧
  • 使用最频繁的列放到联合索引最左侧

索引的优缺点

优点:在数据量大的情况下,索引能提高查询速度;通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性
缺点:创建索引需要耗费时间,影响插入效率;索引也是数据文件,占用存储空间

索引结构

在InnoDB中,主索引的键是主键,叶子节点的数据就是该条记录,其他索引叶子节点的数据是主键值。因此,使用辅助索引查到的只是主键值,还要再走一遍主索引才能拿到数据。

MyISAM 引擎中,B+Tree 叶节点的 data 域存放的是数据记录的地址。在索引检索的时候,首先按照 B+Tree 搜索算法搜索索引,如果指定的 Key 存在,则取出其 data 域的值,然后以 data 域的值为地址读取相应的数据记录。这被称为“非聚簇索引(非聚集索引)”。
InnoDB 引擎中,其数据文件本身就是索引文件。相比 MyISAM,索引文件和数据文件是分离的,其表数据文件本身就是按 B+Tree 组织的一个索引结构,树的叶节点 data 域保存了完整的数据记录。这个索引的 key 是数据表的主键,因此 InnoDB 表数据文件本身就是主索引。这被称为“聚簇索引(聚集索引)”,而其余的索引都作为 辅助索引 ,辅助索引的 data 域存储相应记录主键的值而不是地址,这也是和 MyISAM 不同的地方。在根据主索引搜索时,直接找到 key 所在的节点即可取出数据;在根据辅助索引查找时,则需要先取出主键的值,再走一遍主索引。 因此,在设计表的时候,不建议使用过长的字段作为主键,也不建议使用非单调的字段作为主键,这样会造成主索引频繁分裂。

联合索引和覆盖索引的区别

使用表中的多个字段创建索引,就是 联合索引,也叫 组合索引 或 复合索引。
覆盖索引即需要查询的字段正好是索引的字段,那么直接根据该索引,就可以查到数据了,而无需回表查询。

聚簇索引

索引和数据放在一起的就是聚簇索引,优点是无需回表查询。

索引失效

  • 使用 SELECT * 进行查询;
  • 创建了组合索引,但查询条件未准守最左匹配原则;
  • 在索引列上进行计算、函数、类型转换等操作;
  • % 开头的 LIKE 查询比如 like '%abc';
  • 查询条件中使用 or,且 or 的前后条件中有一个列没有索引,涉及的索引都不会被使用到;
  • 发生隐式转换

MySQL日志

二进制日志 binlog(归档日志),事务日志 redo log(重做日志)和 undo log(回滚日志)

redo log(重做日志)

redo log(重做日志)是InnoDB存储引擎独有的,它让MySQL拥有了崩溃恢复能力。
比如 MySQL 实例挂了或宕机了,重启时,InnoDB存储引擎会使用redo log恢复数据,保证数据的持久性与完整性。

执行时机

每次更新数据时都将更新信息记录到重做日志缓存中,然后当事务提交后,使用默认策略将缓存写到硬盘中的重做日志中。

存储形式

硬盘上存储的 redo log 日志文件不只一个,而是以一个日志文件组的形式出现的,每个的redo日志文件大小都是一样的。比如可以配置为一组4个文件,每个文件的大小是 1GB,整个 redo log 日志文件组可以记录4G的内容。
它采用的是环形数组形式,从头开始写,写到末尾又回到头循环写,

bin log(归档日志)

逻辑日志,记录语句的原始逻辑,用来数据备份,主从复制等。

记录格式
  • statement: 记录的内容是SQL语句原文
  • row: 记录的内容不再是简单的SQL语句了,还包含操作的具体数据。为了解决语句中包含now()之类语句而产生的数据不一致。
  • mixed 混合形式,仅在需要实时计算的地方采用row。
执行时机
  • 事务执行过程中,先把日志不断写到binlog cache,事务提交的时候,再把binlog cache合并后写到binlog文件中。
  • 二进制日志仅在事务提交时记录,并且对于每一个事务,仅包含对应事务的一个日志
  • 重做日志其记录的物理操作日志,因此每个事务对应多个日志条目,并且事务的重做日志写入是并发的,并非在事务提交时写入,故其在文件中记录的顺序并非是事务开始的顺序(下图中带有*的,意为该事务的提交)

两阶段提交

在事务执行过程中记录的redo log不会直接提交,而是进入prepare预备阶段,等事务执行完毕且bin log写入后,再将redo log转为commit阶段。

undo log(回滚日志)

  • 当事务回滚时用于将数据恢复到修改前的样子
  • 另一个作用是 MVCC ,当读取记录时,若该记录被其他事务占用或当前版本对该事务不可见,则可以通过 undo log 读取之前的版本数据,以此实现非锁定读

总结

MySQL InnoDB 引擎使用 redo log(重做日志) 保证事务的持久性,使用 undo log(回滚日志) 来保证事务的原子性。MySQL数据库的数据备份、主备、主主、主从都离不开binlog,需要依靠binlog来同步数据,保证数据一致性。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 210,978评论 6 490
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 89,954评论 2 384
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 156,623评论 0 345
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,324评论 1 282
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,390评论 5 384
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,741评论 1 289
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,892评论 3 405
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,655评论 0 266
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,104评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,451评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,569评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,254评论 4 328
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,834评论 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,725评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,950评论 1 264
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,260评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,446评论 2 348

推荐阅读更多精彩内容