基本原则:

  • 更小的通常更好:占用更少的磁盘 内存和cpu缓存。如varchar(2)和varchar(100)。
  • 简单就好:比如整形比字符型代价更低。使用日期型来存储日期而不是字符串。使用整形存储ip地址。
  • 尽量避免null:如果可以 加上not null约束。因为可以null的列使索引,索引统计,值比较都变得复杂。通常把可为null的列改为not null带来的性能提升比较小,调优时没有必要首先修正这种情况来排查问题。但是如果计划在列上建立索引,如果可以保证是not null,那么尽量加上。

整数类型:

tinyint,smallint.,mediumint,int,bigint.分别是1,2,3,4,8个字节。也就是8,16,24,32,64位,存储的数据范围为-2(n-1)到2(n-1)-1。

如果使用unsigned属性,那么表示不允许负数。那么存储的范围就变成了0到2n-1。

mysql可以为整数类型制定宽度,如int(1)和int(20),只是多了一个宽度约束,在内部,他们都是int。

实数类型:

实数是带小数点的数字。然而他们的作用并不局限与这个。如可以使用decimal存储比bigint还要大的整数。

不精确数字类型(浮点类型):float double,他们分别为4个字节,8个字节。

关于指定精度,书上一掠而过了,以下内容来自网络:

float数值类型用于表示单精度浮点数值,而double数值类型用于表示双精度浮点数值,float和double都是浮点型,而decimal是定点型;MySQL 浮点型和定点型可以用类型名称后加(M,D)来表示,M表示该值的总共长度,D表示小数点后面的长度,M和D又称为精度和标度,如float(7,4)的 可显示为-999.9999,MySQL保存值时进行四舍五入,如果插入999.00009,则结果为999.0001。

decimal最多只能65个数字,也就是是那面总的M最大只能是65。

同样大小的decimal要比float和double占据更大的空间,耗费更多的cpu,所以如果不是要求精确的计算(如财务计算),最好不要使用decimal。

书上提到一种委婉的办法,将有小数的decimal数字成与一定的倍数,如1万倍,然后存储为bigint。可以提升性能。我在想这种委婉的办法带来的性能提升划算吗。可能会在极端的环境下使用吧。

字符串类型:

char和varchar

char在存储上是定长的。在定义的时候需要指定长度。数据库会分配这么大长度的空间。

varchar是变长的,一旦对一个varchar进行update,新的数据变得更长,那么可能数据库需要做存储空间的移动才能容下,或者新的数据变得更小,那么就可能产生碎片。

char和varchar在逻辑上基本是一样的,差别是在存储。

char和varchar在逻辑上的差别是:char在插入的时候会将字符串末尾的空格删除。

blog:存储二进制。text:存储大文本字符串。他们两个都有tiny,small,medium,long的类型。

mysql对于blog和text的排序跟其他的是不一样的,它只对每个列的前max_sort_length(可以配置)字节而不是整个字符串进行排序。

日期型:

datetime和timestamp

datetime可以保存1001-9999年的日期,精度为妙,与时区无关。

timestamp可以保存1970—2038年的日期,精度也为秒,依赖于时区。

mysql没有定义精度小于秒的日期类型,如果需要只能自己用其他数据类型实现。

其他:

疑惑:作者在书上说,建议对id列使用数字,最好使用递增的数字来记录id,如果要使用uuid,一定要-去掉,作为数字存储。如果这样的话,mysql的本身的性能太依赖于使用者的数据类型选择了。如果说用uuid做主键都成了一种负担。

mysql限制一个查询中join的数量控制在61张表,作者建议控制在12个表以内。

mysql不支持物化视图。

避免使用mysql已经遗弃的特性,如指定浮点数的精度(为什么?),或者整数的显示宽度。

小心使用enum和set。尽量不要使用bit。

enum是枚举类型。bit是位,set是位的集合。

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

  1. 第四章:Schema与数据类型优化

    1. 选择优化的数据类型 选择数据类型的原则 更小的通常更好:选择可以正确存储数据的最小数据类型 小的数据类型消耗更少的内存.CPU;占用更少的磁盘 选用简单的数据类型:简单的数据类型通常需要更少的C ...

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

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

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

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

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

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

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

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

  6. MySQL Schema与数据类型优化

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

  7. Schema 与数据类型优化

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

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

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

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

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

随机推荐

  1. WEB框架初识

    HTTP介绍 Hyper Text Transfer Protocol,超文本传输书协议,是万维网数据通信的基础,规定了请求和响应标准. HTTP工作原理 HTTP 请求以及响应的步骤 客户端连接到W ...

  2. 大觅网02Day

    docker环境搭建:(注:请先完成上一次的环境搭建) A.部署环境(导入上次系统的时候修改虚拟机的内存) 1.安装系统自带版本Docker:apt-get install docker.io 2.查 ...

  3. docker随笔

    --查看系统内核版本,docker对于centos系统内核版本需要高于3.10uname -r--移除旧的版本sudo yum remove docker \ docker-client \ dock ...

  4. mobile/immobile species的区别

    在地下水反应运移模型中: “mobile species” 涉及运移和反应过程(transport+reaction) “immobile” species 只涉及反应过程 (reaction)

  5. C学习笔记-typedef

    typedef是一种高级数据特性,它能使某一类型创建自己的名字 typedef unsigned char BYTE; typedef struct man MAN; BYTE b = 0x12; 与 ...

  6. Analysis Methods in Neural Language Processing: A Survey

    本文对神经语言处理中的分析方法进行了综述,并根据研究的突出趋势对其进行了分类,指出了存在的局限性,指出了今后研究的方向.

  7. powerdesiner概念模型转物理模型以及失败的解决方法

    powerdesiner概念模型转物理模型 概念模型转物理模型 关于powerdesinger 出现Entity Attribute code uniqueness解决办法 Entity Attrib ...

  8. 洛谷 P1268 树的重量 题解

    题面 目的:求出树的各边长度 条件:每个节点之间最短路.整个图中不存在负边 我们可以每一次把一个点加入树内,求出这个点和已经构建好的树的边的长度: 这个长度抽象理解一下就是(dis[i][j]+dis ...

  9. Ubuntu中配置Python虚拟环境Virtualenv

    Ubuntu版本为18.04 Virtualenv介绍 在开发Python应用程序的时候,系统安装的Python3只有一个版本:3.4.所有第三方的包都会被pip安装到Python3的site-pac ...

  10. JavaScript使用readAsDataURL读取图像文件

    JavaScript使用readAsDataURL读取图像文件 FileReader对象的readAsDataURL方法可以将读取到的文件编码成Data URL.Data URL是一项特殊的技术,可以 ...