1、数据类型

1.1、几个参考优化原则

  a、  更小的通常更好

    i、更小的数据类型,占用更少磁盘、内存和CPU缓存,需要的CPU周期更少

    ii、如果无法确定哪个数据类型是最好的,就选择不会超过范围的最小类型

  b、  简单就好

    i、简单数据类型的操作仅需少量的CPU周期,EX:整形比字符操作代价更低

  c、  尽量避免null

    i、null将使索引、索引统计和值比较更复杂。

    ii、可null的列需要更多空间

    iii、在MyISAM引擎里甚至还可能导致固定大小的索引变成可变大小的索引

1.2、整数类型

  a、  unsigned 修饰的整数类型,不允许负值,使正数上限提高一倍,跟非unsigned修饰的整型所需空间一样。

  b、  对于存储和计算来说,int(1)和int(20)是相同的,不会限制值的合法范围。

1.3、实数类型

  a、  decimal类型,在5.0以上版本支持精确计算,早期版本因使用浮点计算实现,因此不支持精确计算

  b、  CPU不支持decimal的直接计算,但支持原生浮点计算,所以5.0以后版本decimal效率没浮点计算速度快

  c、  decimal在5.0版本中支持最多65个数字,早期版本则254个数字

  d、  float和double支持标准的浮点运算进行近似计算,所需空间比decimal少

  e、  Double是mysql内部浮点计算的类型

1.4、字符串类型

  a、  各个存储引擎存储char或varchar的方式可能不同。

  b、  varchar

    i、如果mysql建表时使用ROW_FORMAT=FIXED创建的话,varchar会使用定长存储

    ii、varchar需要1-2个额外字节记录长度,阀值为255字节

    iii、varchar节省了存储空间,但使update效率降低

  c、char

    i、存储char时,mysql会删除所有末尾空格

    ii、char类型适合update

    iii、char适合短字符串或值长度相近

    iv、长度不同,char会使用空格填充后进行比较

  d、binary和varbinary

    i、类似char和varchar,用于存储二进制字节码

    ii、填充binary使用\0

    iii、binary效率比char高

  e、BLOB和TEXT

    i、当BLOB和TEXT值太大时,InnoDB会使用外部存储区域

    ii、BLOB存储二进制数据,没有排序规则或字符集

    iii、TEXT有字符集和排序规则

    iv、mysql只对BLOB和TEXT的最前max_sort_length字节排序而不是整个做排序

    v、可设置max_sort_length配置,或使用order by substring()

    vi、mysql不支持blob和TEXT全部字符串索引,也不能使用索引消除排序

    vii、Memory引擎还没完美支持Blob和TEXT

  f、   枚举(ENUM)类型

    i、Mysq在存储枚举时非常紧凑,减少存储空间

    ii、ENUM常量建议使用数字

    iii、保存形式为  数字-字符串  映射形式

       iv、枚举ENUM默认排序按照内部的数字排序,不是常量值排序

    v、可使用field()函数显式指定排序,但会导致无法利用索引消除排序

    vi、修改常量必须使用alter table,仅在末尾添加元素时,再5.1以上版本中可以部重建整个表

    vii、关联查询效率ENUM&ENUM > VARCHAR&VARCHAR > ENUM&VARCHAR

1.5、日期和时间类型

  a、  Mysql支持的最小时间粒度为秒

  b、  MariaDB(mysql的派生数据库)支持微秒级别

  c、  Datetime方位1001年至9999年,精度为秒,封装格式为yyyymmddhhmmss的整数,与时区无关,8字节

  d、  ANSI标准定义的日期和时间表示法:yyyy-MM-DD HH:mm:ss

  e、  Timestamp

    i、范围从1907-01-01以来的秒数,同UNIX时间戳相同,4个字节

    ii、范围1907年至2038年

    iii、from_unixtime()函数转时间戳为日期,unix_timestamp()函数日期转为时间戳

    iv、timestamp显示依赖时区

    v、效率比Datetime高很多

1.6、 位数据类型

  a、  bit

    i、在5.0之前,bit和tinyint是同义词,在5.0之后是完全不同的类型

    ii、bit可指定单个位数,最大长度64位

    iii、bit存储方式因存储引擎而异,MyISAM会压缩bit,Memory和InnoDB则不会

    iv、Mysql把bit当做字符串类型,不是数字类型。

    v、直接检索bit字段和再上下文为数字场景中检索的结果不同,慎用

  b、  set

    i、适合存储多个Boolean值

    ii、在Mysql内部以一系列打包的位集合表示,有效利用空间

    iii、改变列定义代价高且无法索引查找

    iv、FIND_IN_SET()、FIELD()查询

1.7、 选择主键类型的参考建议

  a、  整数通常是最好的选择

  b、  enum和set不建议作为主键类型,其适合存储固定信息

  c、  尽量避免字符串类型作为主键类型,尤其是在MyISAM引擎中,默认对字符串使用压缩引擎,会导致查询变慢很多

  d、  完全随机的字符串会导致性能更慢,比如,UUID,SHA1,MD5等

  e、  如果存储UUID值,应移除 "-" 符号,或者用UNHEX函数转为16字节数字存储在BINARY(16)列中。检索时用HEX()转为16进制格式

2、schema设计中的陷阱

2.1、太多的列

服务器层和存储引擎层的数据拷贝成本提高。不同引擎之间数据转换代价提高。

2.2、太多关联

Mysql限制了每个关联操作最多61张表。单个查询关联最好控制在12个表以内。

2.3、Null of not Invet here

3、范式和反范式

Mysql高性能笔记(一):Schema与数据类型优化的更多相关文章

  1. 高性能mysql 第4章 Schema与数据类型优化

    基本原则: 更小的通常更好:占用更少的磁盘 内存和cpu缓存.如varchar(2)和varchar(100). 简单就好:比如整形比字符型代价更低.使用日期型来存储日期而不是字符串.使用整形存储ip ...

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

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

  3. MySQL Schema与数据类型优化

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

  4. Schema 与数据类型优化

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

  5. Mysql学习笔记(二)数据类型 补充

    原文:Mysql学习笔记(二)数据类型 补充 PS:简单的补充一下数据类型里的String类型以及列类型... 学习内容: 1.String类型 2.列类型存储需求 String类型: i.char与 ...

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

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

  7. Mysql学习笔记(一)数据类型

    原文:Mysql学习笔记(一)数据类型 学习内容: Mysql基本数据类型. 1.数字类型.. i.整型     Mysql数据类型             含义(有符号)     tinyint(m ...

  8. schema与数据类型优化-高性能mysql

    总结作为开发人员重点注意的内容!这是一篇有关高性能MYSQL第四章schema相关的笔记. 0.前言 在项目中,数据库表列有两个text字段,用来存储大文本,在数据规模达到40万后,如果查询没命中索引 ...

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

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

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

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

随机推荐

  1. CVE-2017-1000405 利用脏牛漏洞Linux提权复现

    当前路径: /var/www 磁盘列表: / 系统信息: Linux zico 3.2.0-23-generic #36-Ubuntu SMP Tue Apr 10 20:39:51 UTC 2012 ...

  2. 驰骋开源的asp.net工作流程引擎java工作流 2015 正文 驰骋工作流引擎ccflow6的功能列表

    关键词: 驰骋工作流引擎   ccflow的功能列表   工作流功能列表  表单引擎功能列表 我们工作流引擎ccflow6重构之后对功能做了一些调整,要想快速了解ccbpm的功能,可以以下面列表为准 ...

  3. Add In 简介(主要翻译于ESRI官方文档)

    为ArcGIS桌面端建立Add In插件 平时以工作为主,有空时翻译一些文档,顺便练习英文,这个是因为用Add In来学习一下. 主要包括: 关于Add In 什么时候使用Add In Python ...

  4. 实现DataTables搜索框查询结果高亮显示

    DataTables是封装好的HTML表格插件,丰富了HTML表格的样式,提供了即时搜索.分页等多种表格高级功能.用户可以编写很少的代码(甚至只是使用官方的示例代码),做出一个漂亮的表格以展示数据.关 ...

  5. 百度地图API开发一——仿照现有测距效果实现测面功能

      最近做了一个百度地图API的开发项目,里面有测量距离和测量面积的功能需求.测量距离百度给出了封装好的javascript包——BMapLib.DistanceTool,效果如下: 这个效果体验很好 ...

  6. Powershell Linux正式版可用,启动名称有变

    CentOS yum install powershell 但并没有powershell这个可执行文件.通过搜索可以发现在powershell目录里有pwsh可执行文件,那么以后就要用pwsh执行了. ...

  7. jsp页面中include静态html出现乱码问题的解决方式

    这个问题出现过两次,上次没有做好记录,今天又出现了.不过这两次的情景也不完全一致. 今天通过搜索找到这篇文章的解决方式很好,可供参考.原博客地址http://blog.csdn.net/izgnaw/ ...

  8. 基于gdal的格网插值

    格网插值就是使用离散的数据点创建一个栅格图像的过程.通常情况下,有一系列研究区域的离散点,如果我们想将这些点转换为规则的网格数据来进行进一步的处理,或者和其他网格数据进行合并 等处理,就需要使用格网插 ...

  9. DDctf 新得

    滴这道题当时做的时候只做到了看到index.php的源码 当时给了一个博客的提示猜到是swp的那个 但是没有想到是里面的 文件就没有做了,然后在看了wp过后就明白了 访问博客我文章里面的文章里面的pr ...

  10. 使用RAP2和Mock.JS实现Web API接口的数据模拟和测试

    最近一直在思考如何对Web API的其接口数据进行独立开发的问题,随着Web API的越来越广泛应用,很多开发也要求前端后端分离,例如统一的Web API接口后,Winform团队.Web前端团队.微 ...