第四章、Schema与数据类型优化

前言

版本号 说明
Mysql 5.6.37 MySQL Community Server (GPL) 5.0以上版本即可

这一章主要为接下来的两章《创建高性能的索引》和《查询性能优化》做铺垫,这三章是mysql性能优化的核心内容,这里会讨论逻辑设计,物理设计和查询执行以及彼此之间的相互作用。需要我们既关注全局又关注局部细节。

4.1、数据类型的选择

、常见的优化技巧
  • 1、更小的通常更好,即满足需求下尽可能使用小的数据类型(占用更少的磁盘,内存和CPU)。
  • 2、简单就好:整型比字符型代价更低
  • 3、尽量避免使用NULL,即除非字段中必须有null值,否则设计表时应该设置为not null
  • 4、Date和Timestamp,优先使用TimeStamp,因为其占用的存储空间只有Date的一半,且运行时间范围要小的多,如果可以使用long时间戳,就更好。
4.1.2、常用数据类型
  • 1、数字:下面表格列举常用的数据类型
数据类型 大小 范围 说明
tinyint 1个字节 有符号(-128 到127),无符号(0到255) 默认为有符号
int 4个字节 有符号(- 2^23 ~ 2^23 – 1) 默认为有符号
bigint 8个字节 有符号(-2^63 ~ 2^63 - 1) 默认为有符号
float 4字节 有符号(- 2^23 ~ 2^23 – 1) 单精度浮点
double 8字节 双精度浮点
decimal 不确定 不确定 精确计算
  • 备注:tips
    除了上面的之外,还有下面这些 smallint,mediumint

  • 2、字符串类型
    字符串类型,主要分为char和varchar

数据类型 大小 说明
char 0-255字节 定长字符串
varchar 0-65535字节 变长字符串
tinyblob 0-255字节 小二进制字符串
tinytext 0-255字节 小文本字符串
blob 0-65535字节 二进制字符串
text 0-65535字节 文本字符串
mediumblob 0-(2^24-1)字节 中等二进制字符串
mediumtext 0-(2^24-1)字节 中等文本字符串
longblob 0-(2^32-1)字节 大二进制字符串
longtext 0-(2^32-1)字节 大文本字符串

除此之外,还有BINARY、VARBINARY、ENUM、SET四种类型

FAQ
  • char、varchar和text的区别?
    1、char,存定长,速度快,存在空间浪费的可能,会处理尾部空格,上限255。
    2、varchar,存变长,速度慢,不存在空间浪费,不处理尾部空格,上限65535,但是有存储长度实际65532最大可用。
    3、text,存变长大数据,速度慢,不存在空间浪费,不处理尾部空格,上限65535,会用额外空间存放数据长度,顾可以全部使用65535。
3、Enum枚举类型

值也可以是空串("") 或 NULL

  • 枚举类型是特殊的字符串类型,定义枚举列后,真正存在表中的是整数,表的.frm文件则保存整数和枚举字符串的映射关系
  • 如:CREATE TABLE enum_test(e ENUM('fish','apple','dog') NOT NULL);在表中,真正存储的是,1、2、3这样的数字
  • 不要使用数字作为枚举字符串常量,如ENUM(‘1’,’2’,’3’)。这样会导致混乱
  • 枚举的顺序是按照背地里的数字来排序的,因此,你的Order by语句可能得不到按字符串排序的结果。解决方案就是声明的时候就把字符串排好序,枚举常量对应的数字是和声明时的顺序有关的。还有一种方案是使用如下FIELD语句:
SELECT e FROM enum_test ORDER BY FIELD(e,'apple','dog','fish');
  • ENUM和CHAR(VARCHAR)类型关联查询,会慢一些,因此,假如预先知道某列需要与CHAR类型关联,那么就不应该将该列设置为ENUM类型
  • ENUM类型的列可有效缩小表所占的空间,书中写可缩小1/3
4、日期类型

|数据类型|大小|格式|说明|
| -- |-- | -- |
| date |3字节 | YYYY-MM-DD |日期值|
| datetime |8字节 | YYYY-MM-DD HH:MM:SS |时间和日期值|
| timestamp |4字节 | YYYYMMDDHHMMSS |时间戳|

备注
如果没有特殊需求,日期还是建议存储成long类型的时间戳,这样前后端处理比较统一和方便。

4.2、MySQL schema设计中的陷阱

  • 太多的列:
  • 太多的关联:mysql限制关联最多61个关联,根据经验,单个查询最好控制在12个表以内
  • 全能的枚举:
  • 变相的枚举:

4.3、范式和反范式

在数据库设计中,完全的范式化和完全的反范式化都是实验室中才会存在的,在实际开发过程中很少有这样的使用,需要经常使用。

  • 范式的更新要比反范式的更新要快,但是这样就需要更多的关联,使查询效率降低

4.4、缓存表,汇总表,物化视图,计数器表

这里介绍的相对比较简单,再后期实际应用中进行介绍。

  • 缓存表(汇总表):
    假如统计一个网站23小时发出的消息数,在一个比较忙碌的网站下不可能随时维护一个精准的计数器。代替方案是每小时生成一张汇总表,这样比实时计算要高效的多。简单的说就是维护一些复杂 耗时的计算 那么用汇总表是比较好的选择。
  • 物化视图:物化视图是查询结果的预运算。不同于简单的视图,物化视图的结果一般存储于表中。
  • 计数器表:有些需要计数的功能可以存储,并实时更新。

4.5、加快alter table 的操作速度

这是这几张第一个实际相关操作的功能。我们详细的分析一下。
&MySQL alter一个超大表低效率低的原因

  1. mysql中alter表的机制是:创建一个符合alter目标的表,然后把数据全部插入到新表中,然后删除老表。
  2. 在数据迁移时,每插入一行,需要对索引进行一次更新。效率低下且会产生索引碎片
  3. 当没有足够的内存,或者表上的索引非常多时,效率十分的低下。
  • 优化小技巧
.frm:表结构文件  .MYD:表数据文件  .MYI:表索引

1、 有时候只是改变某个列的配置,比如默认值等等,可以使用ALTER TABLE XXX.XXX ALTER COLUMN XXXX;使用ALTER COLUMN不要使用MODIFY COLUMN,这样修改操作是非阻塞的。

mysql> ALTER TABLE sakila.film
    ->MODIFY COLUMN rental_duration TINYINT(3)  NOT NULL DEFAULT 5;
mysql>ALTER TABLE sakila.film
->ALTER COLUMN rental_duration SET DEFAULT 5;

对比下这两种操作,耗时是不一样的。
2、修改frm文件,这是大神才做的,甚做。

《高性能MySQL读书笔记》

准备篇-mysql安装
准备篇-Sakila数据库
第一章、MySQL架构及历史
第二章、MySQL基准测试
第三章、服务器性能剖析

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

推荐阅读更多精彩内容

  • 良好的逻辑设计和物理设计是高性能的基石,应该根据系统将要执行的查询语句设计schema,但记住这往往需要权衡各种因...
    CaesarXia阅读 1,296评论 0 3
  • 什么是数据库? 数据库是存储数据的集合的单独的应用程序。每个数据库具有一个或多个不同的API,用于创建,访问,管理...
    chen_000阅读 4,005评论 0 19
  • 难得一个周末,终于可以静下心来整理一下笔记了,最近确实没时间。但是我已经预感到风雨后的彩虹,所以一切都会变得很好....
    小炼君阅读 928评论 0 50
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,293评论 18 399
  • 人生来是不平等的,有人来世间看风景,享福禄,有人来受磨难,遭嫌弃。比如我,被所有人视为多余,就连我自己都认为:如果...
    我是晓敏阅读 25,880评论 27 45