Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
wushizhenking
CS-Notes
提交
b83f4852
C
CS-Notes
项目概览
wushizhenking
/
CS-Notes
与 Fork 源项目一致
从无法访问的项目Fork
通知
2
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
C
CS-Notes
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
前往新版Gitcode,体验更适合开发者的 AI 搜索 >>
提交
b83f4852
编写于
6月 30, 2018
作者:
C
CyC2018
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
auto commit
上级
d80e43df
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
16 addition
and
14 deletion
+16
-14
notes/MySQL.md
notes/MySQL.md
+16
-14
未找到文件。
notes/MySQL.md
浏览文件 @
b83f4852
...
@@ -35,28 +35,28 @@
...
@@ -35,28 +35,28 @@
InnoDB 是 MySQL 默认的事务型存储引擎,只有在需要 InnoDB 不支持的特性时,才考虑使用其它存储引擎。
InnoDB 是 MySQL 默认的事务型存储引擎,只有在需要 InnoDB 不支持的特性时,才考虑使用其它存储引擎。
采用 MVCC 来支持高并发,并且实现了四个标准的隔离级别,默认级别是可重复读(REPEATABLE READ),并且通过间隙锁(next-key locking)策略防止幻影读。间隙锁使得 InnoDB 不仅仅锁定查询涉及的行,还会对索引中的间隙进行锁定,以防止幻影行的插入
。
实现了四个标准的隔离级别,默认级别是可重复读(REPEATABLE READ)。在可重复读隔离级别下,通过多版本并发控制(MVCC)+ 间隙锁(next-key locking)防止幻影读
。
表是基于聚簇索引建立的,它对主键的
查询性能有很大的提升。
主索引是聚簇索引,在索引中保存了数据,从而避免直接读取磁盘,因此对
查询性能有很大的提升。
内部做了很多优化,包括从磁盘读取数据时采用的可预测性读、能够
自动在内存中创建哈希索引以加速读操作
的自适应哈希索引、能够加速插入操作的插入缓冲区等。
内部做了很多优化,包括从磁盘读取数据时采用的可预测性读、能够
加快读操作并且自动创建
的自适应哈希索引、能够加速插入操作的插入缓冲区等。
通过一些机制和工具
支持真正的在线热备份。其它存储引擎不支持在线热备份,要获取一致性视图需要停止对所有表的写入,而在读写混合场景中,停止写入可能也意味着停止读取。
支持真正的在线热备份。其它存储引擎不支持在线热备份,要获取一致性视图需要停止对所有表的写入,而在读写混合场景中,停止写入可能也意味着停止读取。
## MyISAM
## MyISAM
MyISAM 设计简单,数据以紧密格式存储。对于只读数据,或者表比较小、可以容忍修复操作,则依然可以使用 MyISAM。
MyISAM 提供了大量的特性,包括压缩表、空间数据索引等。
MyISAM 提供了大量的特性,包括压缩表、空间数据索引等。
不支持事务。
不支持事务。
不支持行级锁,只能对整张表加锁,读取时会对需要读到的所有表加共享锁,写入时则对表加排它锁。但在表有读取
查询
的同时,也可以往表中插入新的记录,这被称为并发插入(CONCURRENT INSERT)。
不支持行级锁,只能对整张表加锁,读取时会对需要读到的所有表加共享锁,写入时则对表加排它锁。但在表有读取
操作
的同时,也可以往表中插入新的记录,这被称为并发插入(CONCURRENT INSERT)。
可以手工或者自动执行检查和修复操作,但是和事务恢复以及崩溃恢复不同,可能导致一些数据丢失,而且修复操作是非常慢的。
可以手工或者自动执行检查和修复操作,但是和事务恢复以及崩溃恢复不同,可能导致一些数据丢失,而且修复操作是非常慢的。
如果指定了 DELAY_KEY_WRITE 选项,在每次修改执行完成时,不会立即将修改的索引数据写入磁盘,而是会写到内存中的键缓冲区,只有在清理键缓冲区或者关闭表的时候才会将对应的索引块写入磁盘。这种方式可以极大的提升写入性能,但是在数据库或者主机崩溃时会造成索引损坏,需要执行修复操作。
如果指定了 DELAY_KEY_WRITE 选项,在每次修改执行完成时,不会立即将修改的索引数据写入磁盘,而是会写到内存中的键缓冲区,只有在清理键缓冲区或者关闭表的时候才会将对应的索引块写入磁盘。这种方式可以极大的提升写入性能,但是在数据库或者主机崩溃时会造成索引损坏,需要执行修复操作。
MyISAM 设计简单,数据以紧密格式存储。对于只读数据,或者表比较小、可以容忍修复操作,则依然可以继续使用 MyISAM。
## 比较
## 比较
-
事务:InnoDB 是事务型的,可以使用 Commit 和 Rollback 语句。
-
事务:InnoDB 是事务型的,可以使用 Commit 和 Rollback 语句。
...
@@ -139,7 +139,7 @@ MySQL 提供了 FROM_UNIXTIME() 函数把 UNIX 时间戳转换为日期,并提
...
@@ -139,7 +139,7 @@ MySQL 提供了 FROM_UNIXTIME() 函数把 UNIX 时间戳转换为日期,并提
查找算法:首先在根节点进行二分查找,如果找到则返回对应节点的 data,否则在相应区间的指针指向的节点递归进行查找。
查找算法:首先在根节点进行二分查找,如果找到则返回对应节点的 data,否则在相应区间的指针指向的节点递归进行查找。
由于插入删除新的数据记录会破坏 B-Tree 的性质,因此在插入删除时,需要对树进行一个分裂、合并、
转移
等操作以保持 B-Tree 性质。
由于插入删除新的数据记录会破坏 B-Tree 的性质,因此在插入删除时,需要对树进行一个分裂、合并、
旋转
等操作以保持 B-Tree 性质。
### 2. B+Tree
### 2. B+Tree
...
@@ -157,15 +157,15 @@ MySQL 提供了 FROM_UNIXTIME() 函数把 UNIX 时间戳转换为日期,并提
...
@@ -157,15 +157,15 @@ MySQL 提供了 FROM_UNIXTIME() 函数把 UNIX 时间戳转换为日期,并提
一般在数据库系统或文件系统中使用的 B+Tree 结构都在经典 B+Tree 基础上进行了优化,在叶子节点增加了顺序访问指针,做这个优化的目的是为了提高区间访问的性能。
一般在数据库系统或文件系统中使用的 B+Tree 结构都在经典 B+Tree 基础上进行了优化,在叶子节点增加了顺序访问指针,做这个优化的目的是为了提高区间访问的性能。
### 4.
B+Tree 和 B-Tree
优势
### 4. 优势
红黑树等平衡树也可以用来实现索引,但是文件系统及数据库系统普遍采用 B
+Tree 和 B-
Tree 作为索引结构,主要有以下两个原因:
红黑树等平衡树也可以用来实现索引,但是文件系统及数据库系统普遍采用 B
Tree 作为索引结构,主要有以下两个原因:
(一)更少的检索次数
(一)更少的检索次数
平衡树检索数据的时间复杂度等于树高 h,而树高大致为 O(h)=O(log
<sub>
d
</sub>
N),其中 d 为每个节点的出度。
平衡树检索数据的时间复杂度等于树高 h,而树高大致为 O(h)=O(log
<sub>
d
</sub>
N),其中 d 为每个节点的出度。
红黑树的出度为 2,而 B
+Tree 与 B-Tree 的出度一般都非常大。红黑树的树高 h 很明显比 B+Tree 和 B-
Tree 大非常多,因此检索的次数也就更多。
红黑树的出度为 2,而 B
Tree 的出度一般都非常大。红黑树的树高 h 很明显比 B
Tree 大非常多,因此检索的次数也就更多。
B+Tree 相比于 B-Tree 更适合外存索引,因为 B+Tree 内节点去掉了 data 域,因此可以拥有更大的出度,检索效率会更高。
B+Tree 相比于 B-Tree 更适合外存索引,因为 B+Tree 内节点去掉了 data 域,因此可以拥有更大的出度,检索效率会更高。
...
@@ -185,7 +185,11 @@ B+Tree 索引是大多数 MySQL 存储引擎的默认索引类型。
...
@@ -185,7 +185,11 @@ B+Tree 索引是大多数 MySQL 存储引擎的默认索引类型。
因为不再需要进行全表扫描,只需要对树进行搜索即可,因此查找速度快很多。除了用于查找,还可以用于排序和分组。
因为不再需要进行全表扫描,只需要对树进行搜索即可,因此查找速度快很多。除了用于查找,还可以用于排序和分组。
可以指定多个列作为索引列,多个索引列共同组成键。B+Tree 索引适用于全键值、键值范围和键前缀查找,其中键前缀查找只适用于最左前缀查找。如果不是按照索引列的顺序进行查找,则无法使用索引。
可以指定多个列作为索引列,多个索引列共同组成键。
B+Tree 索引适用于全键值、键值范围和键前缀查找,其中键前缀查找只适用于最左前缀查找。
如果不是按照索引列的顺序进行查找,则无法使用索引。
InnoDB 的 B+Tree 索引分为主索引和辅助索引。
InnoDB 的 B+Tree 索引分为主索引和辅助索引。
...
@@ -205,8 +209,6 @@ InnoDB 引擎有一个特殊的功能叫“自适应哈希索引”,当某个
...
@@ -205,8 +209,6 @@ InnoDB 引擎有一个特殊的功能叫“自适应哈希索引”,当某个
-
无法用于排序与分组;
-
无法用于排序与分组;
-
只支持精确查找,无法用于部分查找和范围查找;
-
只支持精确查找,无法用于部分查找和范围查找;
-
如果哈希冲突很多,查找速度会变得很慢。
-
哈希索引只包含哈希值和行指针,而不存储字段值,所以不能使用索引中的值来避免读取行。不过,访问内存中的行的速度很快,所以大部分情况下这一点对性能影响并不明显;
### 3. 全文索引
### 3. 全文索引
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录