一、数据类型优化

1、更小通常更好

应该尽量使用可以正确存储数据的最小数据类型,更小的数据类型通常更快,因为它们占用更少的磁盘、内存和CPU缓存,并且处理时需要的CPU周期更少,但是要确保没有低估需要存储的值的范围,如果无法确认哪个数据类型,就选择认为不会超过范围的最小类型。

案例:设计两张表,设计不同的数据类型,查看表的容量

2、简单就好

简单数据类型的操作通常需要更少的CPU周期,例如,

1、整型比字符操作代价更低,因为字符集和校对规则是字符比较比整型比较更复杂

2、使用mysql自建类型而不是字符串来存储日期和时间

3、用整型存储IP地址

案例:创建两张相同的表,改变日期的数据类型,查看SQL语句执行的速度

3、尽量避免null

如果查询中包含可为NULL的列,对mysql来说很难优化,因为可为null的列使得索引、索引统计和值比较都更加复杂,坦白来说,通常情况下null的列改为not null带来的性能提升比较小,所有没有必要将所有的表的schema进行修改,但是应该尽量避免设计成可为null的列

4、实际规则

(1)整数类型

可以使用的几种整数类型:TINYINT,SMALLINT,MEDIUMINT,INT,BIGINT分别使用8,16,24,32,64位存储空间。

尽量使用满足需求的最小数据类型

(2)字符和字符串类型

1、char长度固定,即每条数据占用等长字节空间;最大长度是255个字符,适合用在身份证号、手机号等定长字符串

2、varchar可变程度,可以设置最大长度;最大空间是65535个字节,适合用在长度可变的属性

3、text不设置长度,当不知道属性的最大长度时,适合用text

按照查询速度:char>varchar>text

  • varchar根据实际内容长度保存数据
  1. 使用最小的符合需求的长度。
  2. varchar(n) n小于等于255使用额外一个字节保存长度,n>255使用额外两个字节保存长度。
  3. varchar(5)与varchar(255)保存同样的内容,硬盘存储空间相同,但内存空间占用不同,是指定的大小 。
  4. varchar在mysql5.6之前变更长度,或者从255一下变更到255以上时时,都会导致锁表。
  5. 应用场景:
    1. 存储长度波动较大的数据,如:文章,有的会很短有的会很长
    2. 字符串很少更新的场景,每次更新后都会重算并使用额外存储空间保存长度
    3. 适合保存多字节字符,如:汉字,特殊字符等
  • char固定长度的字符串
  1. 最大长度:255

  2. 会自动删除末尾的空格

  3. 检索效率、写效率 会比varchar高,以空间换时间

  4. 应用场景:

    存储长度波动不大的数据,如:md5摘要

    存储短字符串、经常更新的字符串

(3)BLOB和TEXT类型

MySQL 把每个 BLOB 和 TEXT 值当作一个独立的对象处理。

两者都是为了存储很大数据而设计的字符串类型,分别采用二进制和字符方式存储。

(4)datetime和timestamp

① datetime

  • ​ 占用8个字节
  • ​ 与时区无关,数据库底层时区配置,对datetime无效
  • ​ 可保存到毫秒
  • ​ 可保存时间范围大
  • ​ 不要使用字符串存储日期类型,占用空间大,损失日期类型函数的便捷性

② timestamp

  • ​ 占用4个字节
  • ​ 时间范围:1970-01-01到2038-01-19
  • ​ 精确到秒
  • ​ 采用整形存储
  • ​ 依赖数据库设置的时区
  • ​ 自动更新timestamp列的值

③ date

  • ​ 占用的字节数比使用字符串、datetime、int存储要少,使用date类型只需要3个字节
  • ​ 使用date类型还可以利用日期时间函数进行日期之间的计算
  • ​ date类型用于保存1000-01-01到9999-12-31之间的日期

(5)使用枚举代替字符串类型

有时可以使用枚举类代替常用的字符串类型,mysql存储枚举类型会非常紧凑,会根据列表值的数据压缩到一个或两个字节中,mysql在内部会将每个值在列表中的位置保存为整数,并且在表的.frm文件中保存“数字-字符串”映射关系的查找表

 create table enum_test(e enum('fish','apple','dog') not null);
insert into enum_test(e) values('fish'),('dog'),('apple');
select e+0 from enum_test;

(6)特殊类型数据

人们经常使用varchar(15)来存储ip地址,然而,它的本质是32位无符号整数不是字符串,可以使用INET_ATON()和INET_NTOA函数在这两种表示方法之间转换

案例:

select inet_aton('1.1.1.1')
select inet_ntoa(16843009)

二、合理使用范式以及反范式

1、三范式

1NF:列不可分

2NF:在1NF前提下,表只描述一件事,即没有部分依赖

3NF:在2NF前提下,没有传递依赖

目的:降低表格数据冗余度

2、范式优点以及缺点

优点

范式化的更新通常比反范式要快

当数据较好的范式化后,很少或者没有重复的数据

范式化的数据比较小,可以放在内存中,操作比较快

缺点

由于表格数据冗余度降低,所以查询时经常涉及到关联查询(消耗性能)。

3、反范式优点以及缺点

优点

所有的数据都在同一张表中,可以避免关联

可以设计有效的索引

缺点

表格内的冗余较多,删除数据时候会造成表有些有用的信息丢失

4、范式反范式注意事项

  • 在企业中很好能做到严格意义上的范式或者反范式,一般需要混合使用
  • 在一个网站实例中,这个网站,允许用户发送消息,并且一些用户是付费用户。现在想查看付费用户最近的10条信息。 在user表和message表中都存储用户类型(account_type)而不用完全的反范式化。这避免了完全反范式化的插入和删除问题,因为即使没有消息的时候也绝不会丢失用户的信息。这样也不会user_message表搞得太大,有利于高效地获取数据。
  • 从父表冗余一些数据到子表的理由是排序的需要。
  • 缓存衍生值也是有用的。如果需要显示每个用户发了多少消息(类似论坛的),可以每次执行一个昂贵的自查询来计算并显示它;也可以在user表中建一个num_messages列,每当用户发新消息时更新这个值。

5、案例

范式设计

反范式设计

三、主键的选择

1、代理主键

与业务无关的,无意义的数字序列,比如自增的id等

2、自然主键

事物属性中的自然唯一标识,比如人的身份证号

3、推荐使用代理主键

  • 它们不与业务耦合,因此更容易维护
  • 一个大多数表,最好是全部表,通用的键策略能够减少需要编写的源码数量,减少系统的总体拥有成本

四、字符集的选择

1、字符集设置

参考:MySQL数据库端字符集设置

2、关于字符集之间差异

参考:(精)字符集GBK和UTF8的区别说明

3、字符集选择规则

字符集直接决定了数据在MySQL中的存储编码方式,由于同样的内容使用不同字符集表示所占用的空间大小会有较大的差异,所以通过使用合适的字符集,可以帮助我们尽可能减少数据量,进而减少IO操作次数。

1.纯拉丁字符能表示的内容,没必要选择 latin1 之外的其他字符编码,因为这会节省大量的存储空间。

2.如果我们可以确定不需要存放多种语言,就没必要非得使用UTF8或者其他UNICODE字符类型,这回造成大量的存储空间浪费。

3.MySQL的数据类型可以精确到字段,所以当我们需要大型数据库中存放多字节数据的时候,可以通过对不同表不同字段使用不同的数据类型来较大程度减小数据存储量,进而降低 IO 操作次数并提高缓存命中率。

五、存储引擎的选择

MyISAM不支持事务、不支持行锁、不支持外键

六、适当的数据冗余

1.被频繁引用且只能通过 Join 2张(或者更多)大表的方式才能得到的独立小字段。

2.这样的场景由于每次Join仅仅只是为了取得某个小字段的值,Join到的记录又大,会造成大量不必要的 IO,完全可以通过空间换取时间的方式来优化。不过,冗余的同时需要确保数据的一致性不会遭到破坏,确保更新的同时冗余字段也被更新。

七、适当拆分

当我们的表中存在类似于 TEXT 或者是很大的 VARCHAR类型的大字段的时候,如果我们大部分访问这张表的时候都不需要这个字段,我们就该义无反顾的将其拆分到另外的独立表中,以减少常用数据所占用的存储空间。这样做的一个明显好处就是每个数据块中可以存储的数据条数可以大大增加,既减少物理 IO 次数,也能大大提高内存中的缓存命中率。

MySQL设计之Schema与数据类型优化的更多相关文章

  1. mysql笔记01 MySQL架构与历史、Schema与数据类型优化

    MySQL架构与历史 1. MySQL架构推荐参考:http://www.cnblogs.com/baochuan/archive/2012/03/15/2397536.html 2. MySQL会解 ...

  2. MySQL Schema与数据类型优化

    Schema与数据类型优化 选择优化的数据类型 1.更小的通常更好 更小的数据类型通常更快,因为它们占用更少的磁盘,内存和CPU缓存 2.简单就好 简单数据类型的操作通常需要更少的CPU周期.例如:整 ...

  3. Schema 与数据类型优化

    这是<高性能 MySQL(第三版)>第四章<Schema 与数据类型优化>的读书笔记. 1. 选择优化的数据类型 数据类型的选择原则: 越小越好:选择满足需求的最小类型.注意, ...

  4. 高性能MySQL笔记 第4章 Schema与数据类型优化

    4.1 选择优化的数据类型   通用原则   更小的通常更好   前提是要确保没有低估需要存储的值范围:因为它占用更少的磁盘.内存.CPU缓存,并且处理时需要的CPU周期也更少.   简单就好   简 ...

  5. MySQL Schema 与数据类型优化

    良好的逻辑设计和物理设计是高性能的基石,应该根据系统将要执行的查询语句来设计schema,这往往需要权衡各种因素. 例如,反范式的设计可以加快某些类型的查询,但同时可能使另一些类型的查询变慢:添加计数 ...

  6. Schema与数据类型优化

    良好的逻辑设计和物理设计是高性能的基石,应该根据系统将要执行的查询数据来设计schema,这往往需要权衡各种因素. MySQL支持的数据类型非常多,选择正确的数据类型对于获得高性能至关重要. 更小的通 ...

  7. Mysql高性能笔记(一):Schema与数据类型优化

    1.数据类型 1.1.几个参考优化原则 a.  更小的通常更好 i.更小的数据类型,占用更少磁盘.内存和CPU缓存,需要的CPU周期更少 ii.如果无法确定哪个数据类型是最好的,就选择不会超过范围的最 ...

  8. MySQL之Schema与数据类型优化

    选择优化的数据类型 MySQL支持的数据类型非常多,选择正确的数据类型对于获得高性能至关重要.不管存储哪种类型的数据,下面几个简单的原则都有助于做出更好的选择: 更小的通常更好一般情况下,应该尽量使用 ...

  9. 深入学习MySQL 03 Schema与数据类型优化

    Schema是什么鬼 schema就是数据库对象的集合,这个集合包含了各种对象如:表.视图.存储过程.索引等.为了区分不同的集合,就需要给不同的集合起不同的名字,默认情况下一个用户对应一个集合,用户的 ...

随机推荐

  1. rocketMq broker.conf全部参数解释

    #4.7.1版本 #所属集群名字brokerClusterName=rocketmq-cluster#broker名字,名字可重复,为了管理,每个master起一个名字,他的slave同他,eg:Am ...

  2. springcloud根据日期区间查询同时其他字段模糊查询

    /** * 分页查询完工送检单 * @param entity * @param query * @return */ @GetMapping("getQcProInsAppOverList ...

  3. springMVC搭建分布式框架

    https://www.cnblogs.com/lr393993507/p/7652717.html https://www.cnblogs.com/Tpf386/p/10987931.html

  4. [leetcode]207. Course Schedule课程表

    在一个有向图中,每次找到一个没有前驱节点的节点(也就是入度为0的节点),然后把它指向其他节点的边都去掉,重复这个过程(BFS),直到所有节点已被找到,或者没有符合条件的节点(如果图中有环存在). /* ...

  5. linux零基础之--使用putty配置

    PuTTY是一个Telnet.SSH.rlogin.纯TCP以及串行接口连接软件.随着Linux在服务器端应用的普及,Linux系统管理越来越依赖于远程.在各种远程登录工具中,Putty是出色的工具之 ...

  6. 高性能MySQL学习总结二----常见数据类型选择及优化

    一.数据类型的选择 MySQL的数据类型有很多种,选择正确的数据类型对于获得高性能特别地重要,如何选择合适的数据类型呢?主要遵从以下三个原则: 1.更小的通常情况下性能更好 一般情况下,应该尽量使用可 ...

  7. Redis+LUA整合使用

    .前言 从本章节开始我们就开始讲解一些 Redis 的扩展应用了,之前讲的主从.哨兵和集群都相当重要,也许小公司用不到集群这么复杂的架构,但是也要了解各知识点的原理,只要了解了原理,无论什么时候是有, ...

  8. Spark学习进度-RDD

    RDD RDD 是什么 定义 RDD, 全称为 Resilient Distributed Datasets, 是一个容错的, 并行的数据结构, 可以让用户显式地将数据存储到磁盘和内存中, 并能控制数 ...

  9. Kafka知识总结及面试题

    目录 概念 Kafka基础概念 命令行 Kafka 数据存储设计 kafka在zookeeper中存储结构 生产者 生产者设计 消费者 消费者设计 面试题 kafka设计 请说明什么是Apache K ...

  10. 总结(2019CSP之后),含题解

    从\(\mathcal{CSP}\) 爆炸 到现在,已经有\(3\)个月了.这三个月间,我--这个小蒟蒻又接触了许多听不懂的东西 \(\mathcal{No.}1\) 字符串\(\mathcal{ha ...