第四章 Schema与数据类型优化

一、选择优化的数据类型

  1. 一般情况下,应该尽量使用可以正确存储数据的最小数据类型。但是要确保没有低估需要存储的值的范围,因为在schema中的多个地方增加数据类型的范围是一个非常耗时的操作
  2. 在使用字符类型时需要考虑其校对规则(排序规则)
  3. 尽量避免使用NULL,因为可以为NULL的列会使用更多的存储空间当它被索引时,每个索引的记录需要一个额外的字节用于记录它是否为NULL

二、整数类型

MySQL可以为整数类型指定宽度,对于大多数应用这是没有意义的,它不会限制值的合法范围,只是规定了MySQL的一些交互工具(如命令行客户端)用来显示字符的个数

三、实数类型

实数是带小数部分的数字,MySQL即支持精确类型,也支持不精确类型。FLOAT和DOUBLE类型支持使用标准的浮点运算进行近似计算;DECIMAL类型用于存储精确的小数

因为需要额外的控件和计算开销,所以应该尽量只在对小数进行精确计算时才使用DECIMAL--如存储财务数据。但在数据量比较大的时候,可以考虑使用BIGINT代替DECIMAL,将需要存储的货币单位根据小数位数乘以相应的倍数即可。

四、字符串类型

  1. 字符串定义的长度不是字节数,如varchar(10),定义的是字符长度为10的varchar类型。

  2. varchar类型用于存储可变长字符串,它需要使用1或2个额外的字节记录字符串的长度。

  3. 由于varchar是变长的,在update时,可能新的值比原先的长,从而使得新的行比原来的行长,此时导致需要做一些额外的操作,不同的存储引擎处理方式不一样,InnoDB会通过分裂页的方式来使行可以放进页内(产生碎片)

  4. 下面这些情况适合使用varchar:
    a. 字符串列的最大长度比平均长度大很多;
    b. 列的更新很少,减少碎片的产生。
    c. 使用了像UTF-8这样复杂的字符集,每个字符都使用了不同的字节数进行存储。

  5. char类型是定长的,Mysql总是根据定义的字符串长度分配足够的空间。char适合存储很短的字符串,或者所有值都接近同一个长度。对于经常变更的数据,char也比varchar更好,因为定长不易产生碎片

  6. 慷慨是不明智的,使用varchar(5)和varchar(200)存储‘hello’的空间开销是一样的,但是在实际使用时,我们应该按照实际的存储长度来定义,因为Mysql在运行时,更长的列会消耗更多的存储内存。Mysql通常会分配固定大小的内存块来保存内部值,尤其是使用内存临时表进行排序操作时使用更长的列会显得特别糟糕。

  7. BLOB和TEXT类型
    a. Mysql把每个BLOB和TEXT值当作一个独立的对象处理,存储引擎在存储是通常会做特殊处理
    b. BLOB和TEXT值太大时,InnoDB会使用专门的“外部”存储区域来进行存储,此时每个值在行内需要1~4个字节存储一个指针,然后在外部存储区域存储实际的值
    c. BLOB类型存储的是二进制数据,没有排序规则或字符集
    d. Mysql只对每个TEXT列的最前max_sort_length字节而不是整个字符串做排序
    e. Mysql不能将BLOB和TEXT列全部长度的字符串进行索引。

四、其他类型

  1. 使用枚举类型时要注意,枚举字段是按照内部存储的证书而不是定义的字符串进行排序的。枚举最不好的地方是,字符串列表是固定的,添加或删除字符串必须使用ALTER TABLE,而在旧版本的MySQL中,该操作是会锁表的。

  2. 日期和时间类型
    a. DATETIME精度为秒,使用8个字节的存储。
    b. TIMESTAMP使用4个字节存储。默认情况下,如果插入数据时,没有指定TIMESTAMP列的值,MySQL则设置这个列的值为当前时间。
    d. TIMESTAMP列默认为NOT NULL.

  3. 在选择标识列(identifier,主键)的类型时,不仅仅需要考虑存储类型,还需要考虑mysql对这种类型怎么执行计算和比较。通常整数是标识列最好的选择,因为计算快,而且可以使用AUTO_INCREMENT;因该避免使用字符串类型作为标识列,因为它们很消耗空间,并且通常比数字类型慢,MyISAM默认对字符串使用压缩索引,这会导致查询慢很多。

  4. 太多的列 Mysql在执行查询操作时需要在执行层和存储引擎层之间通过行缓冲格式拷贝数据,然后在执行层将缓冲的内容解码成各个列,转换的代价依赖于列的数量

五、范式和反范式

  1. 在范式化的数据库中,每个事实数据会出现并且只出现一次。相反,在反范式化的数据库中,信息是冗余的,可能会存储在多个地方。

六、加快ALTER TABLE操作的速度

  1. Mysql执行修改表结构的操作方法是用新的结构创建一个空表,从旧表中查处所有数据插入新表,然后删除旧表。

  2. 一般而言,大部分ALTER TABLE操作将导致Mysql服务中断。常使用两个技巧来完成相关的修改操作:一种是先在一台不提供服务的机器上执行ALTER TABLE操作,然后和提供服务的主库进行切换; 另一种是通过“影子拷贝”,影子拷贝的技巧是用要求的表结构创建一张和源表无关的新表(影子表),然后通过重命名和删表操作交换两张表。

  3. 不是所有的ALTER TABLE操作都会引起表重建。例如,有两种方法可以改变或删除一个列的默认值。
    eg: ALTER TABLE tb MODIFY COLUMN tb.col_1 TINYINT(3) NOT NULL DEFAULT 5;
    列的默认值实际上存在表的.frm文件中,所以理论上可以直接修改这个文件而不需要改动表本身,但是Mysql并没有采用这种优化,所有的MODIFY COLUMN 操作都将导致表重建。
    但是通过ALTER COLUMN来操作的话则会直接修改.frm文件而不涉及表数据,所以这个操作非常快。如下所示:
    eg: ALTER TABLE tb ALTER COLUMN tb.col_1 TINYINT(3) NOT NULL DEFAULT 5;

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