第4章 Schema 与数据类型优化


本文为《高性能Mysql 第三版》第四章读书笔记,Mysql版本为5.5

选择优化的数据类型

选择合适数据类型的三个原则

  • 更小的通常更好 - 速度更快,占用更少
  • 简单就好 - 简单数据类型占用更少的CPU周期,例如整型的比字符串操作代价更低
  • 尽量避免NULL - 查询包含NULL的列,对Mysql来说更难优化,因为会使得索引,索引统计和值比较更为复杂

整数类型

整数的类型有:TINYINT 、SMALLINT、MEDIUMINT、INT、BIGINT,分别使用8,16,24,32,64位存储空间

它们存储的值的范围:-2(N-1) 到 2(N-1)- 1

其中N为存储空间的位数

Mysql可以为整数类型指定宽度,例如INT(11),对大多数应用这是没有意义的,它不会限制值的合法范围,只是规定了一些交互工

具用来显示字符的个数而已,对于存储和计算来说,INT(1) 和 INT(20) 是相同的

实数类型

在mysql的数据类型中浮点型分为两种,float()与double()类型,定点型为decimal()

数据类型(M,D) -》M:精度,数据的总长度; D:标度,小数点后的长度;

其区别在于:

  • 当不指定精度时,Float、Double默认会保存实际精度,而Decimal默认是整数
  • 当标度不够时,都会四舍五入,但Decimal会警告信息

字符串类型

VARCHAR 和 CHAR是最主要的字符串类型,CHAR自不必说,实际使用的情况较少,例如存储男/女,YES/NO等确定长度的字符串,但是这种固定的情况有时候用整型去存储效率更高,所以视情况而定吧

VARCHAR存储的是可变长字符串,它比定长类型更节省空间,因为它仅使用必要的空间,它需要用1个或者2个额外字节记录字符串长度

BLOB和TEXT类型:

  • BLOB:二进制存储,没有排序规则和字符集
  • TEXT:字符串存储,有排序规则和字符集

当BLOB和TEXT值太大时,InnoDB会使用专门的“外部”存储区域来进行存储,此时每个值在行内都需要1~4个字节存储一个指针,然后在外部存储区域存储实际的值

日期和时间类型

对于日期和时间类型,据我了解到身边的人大多都不会把时间直接存储到数据库中,同时《高性能Mysql》一书中也推荐另一种做法去存储时间,在这里推荐一下,即:

通过BIGINT类型存储毫秒/微秒级别的时间戳,再显示或者计算的时候都基于时间戳进行计算

选择标识符

选择标识列(identifier column)类型时,不仅要考虑存储类型还要考虑如何进行计算和比较,一旦选定了一种类型,还要确保所

有关联表中使用同样的类型,类型之间需要精确匹配(包括UNSIGNED这样的属性)

整数通常是ID列最好的选择。

使用MD5(),SHA1(),UUID()产生的字符串的值会随机分布在很大的空间中,导致INSERT和一些SELECT语句变得很慢:

  • 插入值随机写到索引的不同位置,导致页分裂,磁盘随机访问等,详见第五章
  • 逻辑上相邻的行会分布在磁盘和内存的不同地方
  • 随机值使得缓存赖以工作的访问局部性原理失效。

存储UUID值应该移除“-”符号;最好使用UNHEX()函数将UUID值转换为16字节的数字,存储在BINARY(16)列中。检索时可以通过HEX()函数格式化成十六进制格式

特殊类型数据

例如:IPV4地址,人们经常使用 VARCHAR(15)列来存储IP地址。然而,它们实际上是32位无符号整数,不是字符串。用小数点将地址分

成四段的表示方法只是为了让人们阅读容易。所以应该用无符号整数存储IP地址,MYSQL提供INET_ATON()和 INET NTOA()函数在这

两种表示方法之间转换

MySQL schema 设计中的陷阱

我们应该避免以下几种情况的出现:

  • 太多的列
  • 太多的关联(上限61张表)
  • 全能的枚举,变相的枚举
  • 随随便便的NULL

范式和反范式

反范式的标志:信息冗余

随着时代和机器的发展,我们会经常使用空间换时间的策略,因此基本淘汰了完全遵循范式的做法,但是在范式与反范式中间一定

要根据业务需求做好设计,减少不必要的空间浪费

缓存表和汇总表

利用Mysql做缓存的可能很少,用作汇总表的可能很多,提供原文中两个场景的较好的解决方案:

例如,如何更好的汇总一天中任务执行次数?

我们可以采用分割的思想,把一天划成小时,一天过去进行数据汇总时全部累加即可

例如,如果统计网站访问人数更合适?

我们当然可以用一条记录总人数,也可以用N天(条)数据记录总人数,然后累加,但是Mysql在执行时候有一定的延时,可能一秒

之内有好几十个人点击,那我们可以针对一条数据进行分割成1-100条数据,通过算法求余等等,让100条数据可以均匀的一起工作

这样可以大幅度增加效率,最终再汇总即可

加快ALTER TABLE操作的速度

不知道其他公司对于底层数据库的字段是否会经常调整,反正我们公司每次需求都会涉及数据库字段的调整,每次都需要执行

ALTER操作,如何提高效率?

  • 主从库切换,减少ALTER影响时间
  • “影子拷贝”,完全创建新表,然后通过重命名+删除的方式替换旧表(无数据的情况)

【高性能Mysql 】读书笔记(二)的更多相关文章

  1. 高性能MySQL --- 读书笔记(1) - 2016/8/2

    此书不但帮助MySQL初学者提高使用技巧,更为有经验的MySQL DBA指出了开发高性能MySQL应用的途径.全书包括14章,内容覆盖MySQL系统架构.设计应用技巧.SQL语句优化.服务器性能调优. ...

  2. 高性能MySQL --- 读书笔记(2) - 2016/8/2

    第1章 MySQL架构 MySQL架构与其他数据库服务器大不相同,这使它能够适应广泛的应用.MySQL足够灵活,能适应高要求架构.例如Web应用,同时还适用于嵌入式应用.数据仓库.内容索引和分发软件. ...

  3. 高性能mysql读书笔记(一):Schema与数据类型优化

    4.5 加快ALTER TABLE 操作的速度 原理: MySQL 的ALTER TABLE 操作的性能对大表来说是个大问题. MySQL 执行大部分修改表结构操作的方法是用新的结构创建一个空表,从旧 ...

  4. 【MySQL 读书笔记】全局锁 | 表锁 | 行锁

    全局锁 全局锁是针对数据库实例的直接加锁,MySQL 提供了一个加全局锁的方法, Flush tables with read lock 可以使用锁将整个表的增删改操作都锁上其中包括 ddl 语句,只 ...

  5. 【MySQL 读书笔记】当我们在执行该查询语句的时候我们在干什么

    看了非常多 MySQL 相关的书籍和文章,没有看到过如此优秀的专栏.所以未来一段时间我会梳理读完该专栏的所学所得. 当我们在执行该查询语句的时候我们在干什么 mysql> select * fr ...

  6. 【MySQL 读书笔记】“order by”是怎么工作的?

    针对排序来说,order by 是我们使用非常频繁的关键字.结合之前我们对索引的了解再来看这篇文章会让我们深刻理解在排序的时候,是如何利用索引来达到少扫描表或者使用外部排序的. 先定义一个表辅助我们后 ...

  7. 《你必须知道的.NET》读书笔记二:小OO有大原则

    此篇已收录至<你必须知道的.Net>读书笔记目录贴,点击访问该目录可以获取更多内容. 一.单一职责原则 (1)核心思想:一个类最好只做一件事,只有一个引起它变化的原因 (2)常用模式:Fa ...

  8. 构建高性能WEB站点笔记二

    构建高性能WEB站点笔记 因为是跳着看的,后面看到有提到啥epoll模型,那就补充下前面的知识. 第三章 服务器并发处理能力 3.2 CPU并发计算 进程 好处:cpu 时间的轮流使用.对CPU计算和 ...

  9. spring揭秘 读书笔记 二 BeanFactory的对象注册与依赖绑定

    本文是王福强所著<<spring揭秘>>一书的读书笔记 我们前面就说过,Spring的IoC容器时一个IoC Service Provider,而且IoC Service Pr ...

  10. 【MySQL 读书笔记】SQL 刷脏页可能造成数据库抖动

    开始今天读书笔记之前我觉得需要回顾一下当我们在更新一条数据的时候做了什么. 因为 WAL 技术的存在,所以当我们执行一条更新语句的时候是先写日志,后写磁盘的.当我们在内存中写入了 redolog 之后 ...

随机推荐

  1. cc30a_demo-CppPrimer_友元与继承-txwtech友元关系不能继承-要明确授予友元

    //友元可以访问类的private与protected成员//友元关系不能继承-要明确授予友元 #include <iostream>//CppPrimer_友元与继承-txwtech-- ...

  2. Python学习日志-02

    (2)Python如何运行程序 Python解释器简介: Python不仅仅是一门编程语言,它也是一个名为解释器的软件包.解释器是一种让其他程序运行起来的程序.当你编写了一段Python程序,Pyth ...

  3. Android安全初学笔记

    安全概述 安全主要解决4类问题 保密:不希望第三方窥探 鉴别:与你通信的人可以被确认 完整性:不能被随意篡改,或者能鉴别是否被篡改 不可否认性:能确认产生信息的人,并且产生该信息的人在何时都无法否认产 ...

  4. 重学 Java 设计模式:实战命令模式「模拟高档餐厅八大菜系,小二点单厨师烹饪场景」

    作者:小傅哥 博客:https://bugstack.cn - 原创系列专题文章 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 持之以恒的重要性 初学编程往往都很懵,几乎在学习的过程中会遇到 ...

  5. JavaWeb网上图书商城完整项目--11.项目所需jquery函数介绍

    1.下载jquery的函数包 2.强函数包添加到工程的web-root目录下 3.在jsp文件中加载js文件 <script type="text/javascript" s ...

  6. JavaWeb开发之四:servlet技术 黑马程序员_轻松掌握JavaWeb开发之四Servlet开发 方立勋老师视频教程相当的经典

    总结: 记住:servlet对象在应用程序运行的过程中只创建一次,浏览器每次访问的时候,创建reponse对象 request对象,然后调用servlet的service方法,reponse对象和re ...

  7. java scoket Blocking 阻塞IO socket通信二

    在上面一节中,服务端收到客户端的连接之后,都是new一个新的线程来处理客户端发送的请求,每次new 一个线程比较耗费系统资源,如果100万个客户端,我们就要创建100万个线程,相当的 耗费系统的资源, ...

  8. SpringSceurity(5)---短信验证码登陆功能

    SpringSceurity(5)---短信验证码登陆功能 有关SpringSceurity系列之前有写文章 1.SpringSecurity(1)---认证+授权代码实现 2.SpringSecur ...

  9. Flutter 中那么多组件,难道要都学一遍?

    在 Flutter 中一切皆是 组件,仅仅 Widget 的子类和间接子类就有 350 多个,整理的 Flutter组件继承关系图 可以帮助大家更好的理解学习 Flutter,回归正题,如此多的组件到 ...

  10. Java 线程基础,从这篇开始

    线程作为操作系统中最少调度单位,在当前系统的运行环境中,一般都拥有多核处理器,为了更好的充分利用 CPU,掌握其正确使用方式,能更高效的使程序运行.同时,在 Java 面试中,也是极其重要的一个模块. ...