
传统情况
我们先回顾一下,在没有 "立刻加列" 功能时,加列 *** 作是怎么完成的。我们也借此来熟悉一下本期的图例:
当进行 加列 *** 作 时,所有的数据行 都必须要 增加一段数据(图中的 列 4 数据)
如上一期图解所讲,当改变数据行的长度,就需要 重建表空间(图中灰蓝的部分为发生变更的部分)
数据字典中的列定义也会被更新
以上 *** 作的问题在于 每次加列 *** 作都需要重建表空间,这就需要大量 IO以及大量的时间
立刻加列
"立刻加列" 的过程如下图:
"立刻加列" 时,只会变更数据字典中的内容,包括:
在列定义中增加 新列的定义
增加 新列的默认值
"立刻加列" 后,当要读取表中的数据时:
由于 "立刻加列" 没有 变更行数据,读取的行数据只有 3 列
MySQL 会将 新增的第 4 列的默认值,追加到 读取的数据后
以上过程描述了 如何读取 在 "立刻加列" 之前写入的数据,其实质是:在读取数据的过程中,"伪造" 了一个新列出来
那么如何读取 在 "立刻加列" 之后 写入的数据呢 过程如下图:
当读取 行 4 时:
通过判断 数据行的头信息中的instant 标志位,可以知道该行的格式是 "新格式":该行头信息后有一个新字段 "列数"
通过读取 数据行的 "列数" 字段,可以知道 该行数据中多少列有 "真实" 的数据,从而按列数读取数据
通过上图可以看到:读取 在"立刻加列" 前/后写入的数据是不同的流程
通过以上的讨论,我们可以总结 "立刻加列" 之所以高效的原因是:
在执行 "立刻加列" 时,不变更数据行的结构
读取 "旧" 数据时,"伪造" 新增的列,使结果正确
写入 "新" 数据时,使用了新的数据格式(增加了instant标志位 和 "列数" 字段),以区分新旧数据
读取 "新" 数据时,可以如实读取数据
那么 我们是否能一直 "伪造" 下去 "伪造" 何时会被拆穿
考虑以下场景:
用 "立刻加列" 增加列 A
写入数据行 1
用 "立刻加列" 增加列 B
写入数据行 2
删除列 B
我们推测一下 "删除列 B" 的最小代价:需要修改 数据行中的instant标志位或 "列数" 字段,这至少会影响到 "立刻加列" 之后写入的数据行,成本类似于重建数据
从以上推测可知:当出现 与 "立刻加列" *** 作不兼容 的 DDL *** 作时,数据表需要进行重建,如下图所示:
扩展思考题:是否能设计其他的数据格式,取代instant标志位和 "列数" 字段,使得 加列/删列 *** 作都能 "立刻完成" (提示:考虑 加列 - 删列 - 再加列 的情况)
使用限制
在了解原理之后,我们来看看 "立刻加列" 的使用限制,就很容易能理解其中的前两项:
"立刻加列" 的加列位置只能在表的最后,而不能加在其他列之间
在元数据中,只记录了 数据行 应有多少列,而没有记录 这些列 应出现的位置。所以无法实现指定列的位置
"立刻加列" 不能添加主键列
加列 不能涉及聚簇索引的变更,否则就变成了 "重建" *** 作,不是 "立刻" 完成了
"立刻加列"不支持压缩的表格式
按照 WL 的说法:"COMPRESSED is no need to supported"(没必要支持不怎么用的格式)
总结回顾
我们总结一下上面的讨论:
"立刻加列" 之所以高效的原因是:
在执行 "立刻加列" 时,不变更数据行的结构
读取 "旧" 数据时,"伪造" 新增的列,使结果正确
写入 "新" 数据时,使用了新的数据格式 (增加了 instant 标志位 和 "列数" 字段),以区分新旧数据
读取 "新" 数据时,可以如实读取数据
"立刻加列" 的 "伪造" 手法,不能一直维持下去。当发生 与 "立刻加列" *** 作不兼容 的 DDL 时,表数据就会发生重建
回到之前遗留的两个问题:
"立刻加列" 是如何工作的
我们已经解答了这个问题
所谓 "立刻加列" 是否完全不影响业务,是否是真正的 "立刻" 完成
可以看到:就算是 "立刻加列",也需要变更 数据字典,那么 该上的锁还是逃不掉的。也就是说 这里的 "立刻" 指的是 "不变更数据行的结构",而并非指 "零成本地完成任务"
弊远远大于利。
数据库的原始设计(以及所有的编程语言),都是基于英文,中文如果遇上乱码的问题,反正会很难处理。
打字老是切换中英文,这个速度上也会变慢了好多比如
select
学生名字
from
学生表格
where
学生年龄>10;
中英文切换来切换去,实在是太麻烦了。
至于利,反正我看不到。除了说能一眼看到这个表名用上了中文,某些人会有莫名其秒的成就感,除此之后,我也想不出别的什么了。
数据库书写格式中需以分号进行结尾。
数据库文件的格式包括CSV、DAT、DBF、MDB、ODB++等等。具体如下:
1、CSV
是逗号分隔值文件格式,其文件以纯文本形式存储表格数据。纯文本意味着该文件是一个字符序列,不含必须像二进制数字那样被解读的数据。CSV文件由任意数目的记录组成,记录间以某种换行符分隔;每条记录由字段组成,字段间的分隔符是其它字符或字符串。
2、DAT文件
DAT文件,即数据文件,这类文件并没有进行绝对化的定义。DAT文件的扩展名是dat。这种文本是纯文本,没有数据属性结构方面的信息,可以用记事本等文本工具打开。
3、DBF
是一种特殊的文件格式,表示数据库文件。Foxbase、Dbase、Visual FoxPro等数据库处理系统所产生的数据库文件。简写为dbf或dbf。DBF dBASE文件,一种由Ashton-Tate创建的格式。
4、MDB
使用mdb格式的数据库是一种关系数据库。MDB View可以在没有安装 Microsoft Access情况下进行阅读MDB数据库文件。因其对数据 *** 作的方便性,常用在一些中小型程序。MDB是MDB/ ICP协议的简称,欧洲售货机制造者协会制定用于协调自动售货系统主控制器与多个外设间通信的协议。
5、ODB++
ODB++是一种可扩展的ASCII格式,它可在单个数据库中,保存PCB制造和装配所必需的全部工程数据。是能把多种数据格式数据库连接起来的桥梁,也是一种双向格式,允许数据上行和下传。
数据库是没有列的概念的
只有表TABLE 才有列的概念
表的列就是表的字段
CREATE TABLE A
(COL1 INT
COL2 CHAR(10))
COL1 COL2就是表A的列(column)
编码问题,点击开始菜单中Mysql找到MySQL Server Instance Config Wizard重新配置,到选择字符集那一页里,选择自定义,然后找到gb2312,选择此字符集,后即可,
以上就是关于MySQL 数据库如何添加列全部的内容,包括:MySQL 数据库如何添加列、数据库表名,列名用中文有什么利弊、数据库书写格式中以什么结尾等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)