4.1 选择优化的数据类型
 
通用原则
 
更小的通常更好
 
前提是要确保没有低估需要存储的值范围:因为它占用更少的磁盘、内存、CPU缓存,并且处理时需要的CPU周期也更少。
 
简单就好
 
简单数据类型的操作需要更少的CPU周期。
 
尽量避免NULL
 
值可为NULL的列使得索引、索引统计和值比较都更复杂化。可为NULL的列会使用更多的存储空间。
 
整数类型
 
TINYINT SMALLINT MEDIUMINT INT BIGINT。分别使用8,16,24,32,64位存储空间。他们可以存储的值的范围从 -2(N-1) 到 2(N-1)-1,其中N为存储空间的位数。
 
UNSIGNED 属性标识不允许负值,存储之的范围将变为0到2(N)-1。
 
MySQL 可以为整数类型指定宽度,例如INT(11),他不会限制值得合法范围,只是规定了MySQL的一些交互工具 用来显示字符的个数。对于存储和计算来说,INT(1)和INT(20)是相同的。
 
实数类型
 
FLOAT DOUBLE DECIMAL。
 
字符串类型
 
VARCHAR CHAR
 
  • VARCHAR 类型用于存储可变长字符串。
 
  • CHAR 类型用于存储定长字符串。非常适用于存储MD5值。
 
  • VARCHAR 需要使用1或2个额外字节记录字符串的长度:如果列的最大长度小于或等于255字节,则只使用1个字节表示,否则使用2个字节。VARCHAR节省了存储空间,所以对性能也有帮助。但是,由于行是变长的,在update时可能使行变得比原来更长,这就导致需要做额外的工作,不同的存储引擎的处理方式是不一样的。例如,MyISAM会将行拆成不同的片段存储,InnoDB则需要分裂页来使行可以放进页内。
 
 
BLOB TEXT
 
  • BLOB采用二进制方式存储,没有排序规则或字符集。
 
  • TEXT采用字符方式存储,有字符集和排序规则。
 
  • TINYTEXT SMALLTEXT TEXT MEDIUMTEXT LONGTEXT,其中TEXT=SMAILLTEXT。
 
  • TINYBLOB SMALLBLOB BLOB MEDUIMBLOB LONGBLOB,其中BLOB=SMALLBLOB。
 
使用枚举(ENUM)代替字符串类型
 
枚举列把一些不重复的字符串存储成一个预定义的集合。
 
MySQL在内部会将每个值在集合中的位置保存为整数。
 
日期和时间类型
 
DATETIME TIMESTAMP TIME DATE YEAR
 
特殊类型数据
 
IPv4地址,MySQL提供INET_ATON() 和INET_NTOA()函数来相互转换。
 
4.2 MySQL schema 设计中的陷阱
 
  • 太多的列
 
  • 太多的关联:最好小于12
 
  • 错误使用枚举
 
  • 非此发明的NULL
 
4.3 范式和反范式
 
三大范式
 
  • 第一范式(1NF)是指数据库表的每一列都是不可分割的基本数据项,同一列中不能有多个值,即实体中的某个属性不能有多个值或者不能有重复的属性。
 
  • 第二范式(2NF)要求数据库表中的每个实例或行必须可以被唯一地区分。为实现区分通常需要为表加上一个列,以存储各个实例的唯一标识(主键)。
 
  • 第三范式(3NF)要求一个数据库表中不包含已在其它表中已包含的非主关键字信息。
 
范式的优缺点
 
优点
 
  • 范式化的更新操作通常比反范式化要快;
 
  • 当数据较好地范式化时,就只要很少或者没有重复数据,所以只需要修改更少的数据;
 
  • 范式化的表通常更小,可以更好地放在内存里,所以执行操作会更快;
 
  • 很少有多余的数据意味着检索列表数据时更少需要DISTINCT或者GROUP BY语句。
 
缺点
 
范式化设计的schema的缺点通常需要关联。这不但代价昂贵,也可能使一些索引策略无效。
 
反范式的优缺点
 
优点
 
  • 避免关联;
 
缺点
 
  • 冗余字段;
 
4.6 总结
 
  • 尽量避免过度设计,例如会导致极其负责查询的schema设计,或者有很多列的表的设计;
 
  • 使用小而简单的适合数据类型,除非真实数据模型镇南关有确切的需要,否则应该尽可能地避免使用NULL值;
 
  • 尽量使用相同的数据类型存储相似或相关的值,尤其是要在关联条件中使用的列;
 
  • 注意可变长字符串,其在临时表中排序时可能导致悲观的按最大长度分配内存;
 
  • 尽量使用整形定义标识列;
 
  • 避免使用MySQL已经遗弃的特性,例如指定浮点数的精度,后者整数的显示宽度;
 
  • 小心使用ENUM和SET。虽然他们用起来很方便,但是不要滥用,否则有时候会变成陷阱。最好避免使用BIT;
 
 
 
 

高性能MySQL笔记 第4章 Schema与数据类型优化的更多相关文章

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

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

  2. 高性能MySQL笔记 第6章 查询性能优化

    6.1 为什么查询速度会慢   查询的生命周期大致可按照顺序来看:从客户端,到服务器,然后在服务器上进行解析,生成执行计划,执行,并返回结果给客户端.其中“执行”可以认为是整个生命周期中最重要的阶段. ...

  3. 高性能MySQL笔记-第4章Optimizing Schema and Data Types

    1.Good schema design is pretty universal, but of course MySQL has special implementation details to ...

  4. 高性能MySQL笔记 第5章 创建高性能的索引

    索引(index),在MySQL中也被叫做键(key),是存储引擎用于快速找到记录的一种数据结构.索引优化是对查询性能优化最有效的手段.   5.1 索引基础   索引的类型   索引是在存储引擎层而 ...

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

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

  6. 高性能MySQL笔记-第1章MySQL Architecture and History-001

    1.MySQL架构图 2.事务的隔离性 事务的隔离性是specific rules for which changes are and aren’t visible inside and outsid ...

  7. 高性能MySQL笔记-第5章Indexing for High Performance-004怎样用索引才高效

    一.怎样用索引才高效 1.隔离索引列 MySQL generally can’t use indexes on columns unless the columns are isolated in t ...

  8. 高性能MySQL笔记-第5章Indexing for High Performance-002Hash indexes

    一. 1.什么是hash index A hash index is built on a hash table and is useful only for exact lookups that u ...

  9. 高性能MySQL笔记-第5章Indexing for High Performance-001B-Tree indexes(B+Tree)

    一. 1.什么是B-Tree indexes? The general idea of a B-Tree is that all the values are stored in order, and ...

随机推荐

  1. NOSQL学习笔记系列之MongoDB 一 基础

    主题:MongoDB 学习资料参考网址: 1.http://www.w3cschool.cc/mongodb/mongodb-tutorial.html 2.http://www.icoolxue.c ...

  2. struts 用拦截器进行用户权限隔离,未登录用户跳到登录界面 *** 最爱那水货

    一般,我们的web应用都是只有在用户登录之后才允许操作的,也就是说我们不允许非登录认证的用户直接访问某些页面或功能菜单项.对于个别页面来说,可能不需要进行拦截,此时,如果项目采用struts view ...

  3. selenium启动firefox时加载扩展

    有些时候,我们测试需要用到插件或者已经导入的证书(比如金融和安全加密行业),而selenium启动firefox时会打开一个新的,不含有任何插件和个人证书的firefox(等同于全新安装后第一次打开的 ...

  4. winform 固定splitContainer某一部分大小

    处于布局省事考虑,通常会用splitcontainer进行总体的布局,例如: 默认情况下,splitcontainer在运行时会根据上下文自动调整每个panel的大小,但大部分情况下,其实我们希望左边 ...

  5. Android应用开发基础之十:多媒体编程

    多媒体概念 文字.图片.音频.视频 计算机图片大小的计算 图片大小 = 图片的总像素 * 每个像素占用的大小 单色图:每个像素占用1/8个字节 16色图:每个像素占用1/2个字节 256色图:每个像素 ...

  6. css知多少(3)——样式来源与层叠规则

    上一节<css知多少(2)——学习css的思路>有几个人留言表示思路很好.继续期待,而且收到了9个赞,我还是比较欣慰的.没看过的朋友建议先去看看上一节. 这一节就开始实践上一节的思路! 1 ...

  7. 一个python线程池的源码解析

    python为了方便人们编程高度封装了很多东西,比如进程里的进程池,大大方便了人们编程的效率,但是默认却没有线程池,本人前段时间整理出一个线程池,并进行了简单的解析和注释,本人水平有限,如有错误希望高 ...

  8. 2015年Java开发岗位面试题归类

    一.Java基础 1. String类为什么是final的. 2. HashMap的源码,实现原理,底层结构. 3. 说说你知道的几个Java集合类:list.set.queue.map实现类咯... ...

  9. 操作系统开发系列—10.内核HelloWorld ●

    a.我们先来体验一下在Linux下用汇编编程的感觉,见代码 [section .data] ; 数据在此 strHello db "Hello, world!", 0Ah STRL ...

  10. android中实现跑马灯效果以及AutoCompleteTestView与MultiAutoCompleteTextView的学习

    跑马灯效果 1.用过属性的方式实现跑马灯效果 属性:                  android:singleLine="true" 这个属性是设置TextView文本中文字 ...