前言:
     最近在看高性能 MySQL,记录写学习笔记:
          高性能 MySQL 学习笔记(二) Schema与数据类型优化
     笔记核心内容:MySQL 如何选择正确的数据类型,各数据类型的差异;
 
     // 不要小看 MySQL 数据类型对性能的重要性,
         当你的系统体量到达一定程度时,就知道这里的性能差异了。
 
 
一、选择优化的数据类型
 
     // 更小的通常越好
     尽量选择使用可以正确存储数据的最小数据类型。更小的数据类型通常更快,
     因为它们占用更少的磁盘、内存和 CPU 缓存,并且处理时需要的 CPU 周期也更少;
 
     // 简单最好
     整型比字符型要好,两个例子,应该使用 MySQL 内建的类型来存储日期而不是字符串;
     使用整形存储 IP 地址。因为字符的校对、排序规则要复杂。
 
     // 尽量避免 NULL
     通常情况下最好指定列为 NOT NULL,除非真的需要存储 NULL 值;
     如果查询中包含可为 NULL 的列,对 MySQL 来说更难优化,
     因为可为 NULL 的列是的索引、索引统计和值比较,都更为复杂。
     允许为 NULL 的列,存储空间上占用更多,同时 MySQL 还需要对它特殊处理。
 
整数类型:
 
     可以使用的几种整数类型:TINYINT,SMALLINT,MEDIUMINT,INT,BIGINT
     分别使用8,16,24,32,64位存储空间。
 
     整数类型有可选的 UNSIGNED 属性,表示不允许负值,这大致可以使正数的上限提高一倍。
     整数计算一般使用 64 位的 BIGINT 整数,即使 32 位环境也是如此(一些聚合函数是例外,他们使用DECIMAL或DOUBLE进行计算)。
 
     MySQL 可以为整数类型指定宽度,例如 INT(11),对大多数应用这是没有意义的;
     它并不会限制值的合法范围。
     对于存储和计算来说,INT(1) 和 INT(20) 是相同的。
 
实数类型:
 
     FLOAT 和 DOUBLE 类型支持使用标准的浮点运算进行近似计算。
     DECIMAL 类型用于存储精确的小数,MySQL 服务器自身实现了 DECIMAL 的高精度计算,
     相对而言,CPU直接支持原生浮点计算,所以浮点计算明显更快。
 
     浮点和 DECIMAL 类型都可以指定精度,对于 DECIMAL 可以指定小数点前后所允许的最大位数,
     这会影响列的空间消耗。浮点类型在存储同样范围的值时,
     通常比 DECIMAL 使用更少的空间,所以应该尽量只在对小数进行精确计算时才使用。
 
     DECIMAL(18, 9) 小数点两点各存储 9 个数字,一共使用 9 个字节;
     DECIMAL 可以存储的整数比 BIGINT 还要大;
 
     浮点型以及 DECIMAL 在存取时,都需要额外的空间和计算的开销,
     所以应该尽量只对小数进行精确计算时才使用 DECIAML;
     如果数据量比较大的时候,可以考虑使用 BIGINT 代替 DECIAML。 
     // 这就是为什么微信的数据库(猜的因为接口都是分为单位)使用 BIGINT 来做处理,
         目的就是为了节省 MySQL 计算带来的额外损耗;
 
字符串类型:
 
     VARCHAR 存储可变长字符串。 当列的更新很少,使用了像 UTF-8 这样复杂的字符集时,使用 VARCHAR 存储。
     CHAR 类型是定长的,当存储 MD5 值,定长的值,或经常变更的数据时,用 CHAR 存储,因为这样不容易产生碎片。 
 
     VARCHAR 类型存储可变长字符串,他比定长类型更节省空间,VARCHAR 节省了存储空间,所以对性能也有帮助,但由于是变长的,
     在 UPDATE 时可能使行变得比原来长,这就导致需要做额外的工作。     
 
     存储引擎存储 CHAR 或者 VARCHAR 值的方式在内存中和硬盘上可能不一样。
     如果一个行占用的空间增长,并在业内没有更多足够的空间可以存储时,
     MyISAM 存储引擎会将拆分成不同的片段存储;而 InnerDB 则需要分裂页放进页内才行;
 
BLOB 和 TEXT 类型
 
     MySQL 把每个 BLOB 和 TEXT 值当作一个独立的对象处理。
     两者都是为了存储很大数据而设计的字符串类型,分别采用二进制和字符方式存储。
 
ENUM 枚举类型:
     
     有时候可以使用枚举代替常用的字符串类型,枚举把一些不重复的字符串存储成一个预定义的集合。
     枚举在保存时是(数字-字符串)的形式。
     将可优化的数据类型字段改为 ENUM 枚举类型后,关联查询性能可提升将近一倍。(书中列子暂不细说)
     
     SELECT SQL_NO_CACHE COUNT(*) FROM tables
     JOIN tables2 USING(day, account...);
 
日期和时间类型:
     
     MySQL 使用许多类型保存日期和时间值,例如 Year 和 Date,MySQL 能存储的最小时间粒度为秒。
 
     MySQL 提供两种相似的日期类型:DATETIME 和 TIMESTAMP,
     在某些场合一个比另一个工作的更好。
     DATETIME 这个类型保存的最大值从1001到9999年,精度为秒。
     TIMESTAMP 使用 4 个字节保持日期,默认 NOT NULL。
 
     除了特殊行为之外,通常也应该尽量使用 TIMESTAMP 类型。
 
位类型:
 
     BIT 最大长度 64 个位。MySQL 把 BIT 当作字符串类型,而不是数字类型。
     // 很多开发人员喜欢使用 BIT 作为 BOOL 类型来存储某些数据,true/false 这种,但是最好避免使用 BIT 类型。 
 
     如果想在一个 bit 的存储空间中存储一个 true/false 的话,建议使用一个可以为空的 CHAR(0) 类型。
 
     同时也可以考虑使用 SET 类型,SET 类型 MySQL 内部是以一系列打包位的集合来表示的,
     MySQL 有像 FIND_IN_SET 和 FIELD 这样的函数,方便在查询中使用。
     他的主要缺点是改变列的代价太高,也无法在SET上通过索引查找。

MySQL 基础数据类型优化(如何选择数据类型)的更多相关文章

  1. MYSQL基础笔记(六)- 数据类型一

    数据类型(列类型) 所谓数据烈性,就是对数据进行统一的分类.从系统角度出发时为了能够使用统一的方式进行管理,更好的利用有限的空间. SQL中讲数据类型分成三大类:1.数值类型,2.字符串类型和时间日期 ...

  2. MYSQL基础笔记(七)- 数据类型二

    字符串类型 在SQL中,讲字符串类型分成了六类:char,varchar,text,blob,enum,set char,定长字符串 磁盘(二维表)在定义结构的时候,就已经确定了最终数据的存储长度. ...

  3. MySQL基础篇(2)数据类型

    MySQL提供了多种数据类型,主要包括数值型.字符串类型.日期和时间类型. 1.数值类型 整数类型:TINYINT(1字节).SMALLINT(2字节).MEDIUMINT(3字节).INT(INTE ...

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

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

  5. mysql学习二、SQL常用数据类型

    一.常用数据类型 二.选择数据类型的原则: 1 业务需要 2 满足第一个条件下,需要存储空间最小的. 三.常用的选择数据类型思路:

  6. Mysql基础调优

    mysql基础的优化方式 1.利用索引加快查询速度 2.利用查询缓存或者旁挂式缓存,提高访问速度 缓存:k/v key:查询语句的hash值 value:查询语句的执行结果 哪些查询可能不会被缓存? ...

  7. MYSQL基础笔记(五)- 练习作业:站点统计练习

    作业:站点统计 1.将用户的访问信息记录到文件中,独占一行,记录IP地址 <?php //站点统计 header('Content-type:text/html;charset=utf-8'); ...

  8. MySql(十):MySQL性能调优——MySQL Server性能优化

    本章主要通过针对MySQL Server( mysqld)相关实现机制的分析,得到一些相应的优化建议.主要涉及MySQL的安装以及相关参数设置的优化,但不包括mysqld之外的比如存储引擎相关的参数优 ...

  9. { MySQL基础数据类型}一 介绍 二 数值类型 三 日期类型 四 字符串类型 五 枚举类型与集合类型

    MySQL基础数据类型 阅读目录 一 介绍 二 数值类型 三 日期类型 四 字符串类型 五 枚举类型与集合类型 一 介绍 存储引擎决定了表的类型,而表内存放的数据也要有不同的类型,每种数据类型都有自己 ...

随机推荐

  1. 从B 树、B+ 树、B* 树谈到R 树(转)

      作者:July.weedge.Frankie.编程艺术室出品. 说明:本文从B树开始谈起,然后论述B+树.B*树,最后谈到R 树.其中B树.B+树及B*树部分由weedge完成,R 树部分由Fra ...

  2. javaSE27天复习总结

    JAVA学习总结    2 第一天    2 1:计算机概述(了解)    2 (1)计算机    2 (2)计算机硬件    2 (3)计算机软件    2 (4)软件开发(理解)    2 (5) ...

  3. selenium屏蔽谷歌浏览器弹出的通知

    使用chromeoptions来修改浏览器的设置 from selenium import webdriver import time options = webdriver.ChromeOption ...

  4. CentOS Linux中zip压缩和unzip解压缩命令详解

    以下命令均在/home目录下操作cd /home  #进入/home目录1.把/home目录下面的mydata目录压缩为mydata.zip     zip -r  mydata.zip   myda ...

  5. SecureCRT卡死的问题

    ctrl+s是一个古老的shell控制键,不小心按倒就卡死了.在输入ctrl+q就可以恢复了

  6. PDO:数据访问抽象层

    <?php //PDO:数据访问抽象层 //带有事务功能: //dsn:数据源 $dsn="mysql:host=localhost;dbname=aaas"; //造pdo ...

  7. Centos----本地yum源制作

    本地YUM源制作 1.   YUM相关概念 1.1.  什么是YUM YUM(全称为 Yellow dog Updater, Modified)是一个在Fedora和RedHat以及CentOS中的S ...

  8. js判断有无属性

    访问元素属性 getAttribute 不存在返回null,特性名可不区分大小写 dom对象访问公共属性,自定义属性不能访问,div.id 访问对象属性 1.使用in关键字 该方法可以判断对象的自有属 ...

  9. CentOS7在VMWare12中安装后不能上网解决办法

    首先要保证你的VMWare Workstation12 在安装号CentOS7后没改动什么关于网络相关的. 1.我的电脑一开始用的是VMWare WorkStations10,发现VMnet8根本不通 ...

  10. Ubuntu系统常用操作命令

    1.基本命令: sudo 提升用户权限为root用户 ls 显示文件内容 cd 进入指定路径,后接路径参数 如cd /进入根目录 cd -进入用户目录 cd ..返回上一级目录 mv xx.txt x ...