高性能mysql 第4章 Schema与数据类型优化
基本原则:
- 更小的通常更好:占用更少的磁盘 内存和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与数据类型优化的更多相关文章
- 第四章:Schema与数据类型优化
1. 选择优化的数据类型 选择数据类型的原则 更小的通常更好:选择可以正确存储数据的最小数据类型 小的数据类型消耗更少的内存.CPU;占用更少的磁盘 选用简单的数据类型:简单的数据类型通常需要更少的C ...
- 高性能MySQL笔记 第4章 Schema与数据类型优化
4.1 选择优化的数据类型 通用原则 更小的通常更好 前提是要确保没有低估需要存储的值范围:因为它占用更少的磁盘.内存.CPU缓存,并且处理时需要的CPU周期也更少. 简单就好 简 ...
- Mysql高性能笔记(一):Schema与数据类型优化
1.数据类型 1.1.几个参考优化原则 a. 更小的通常更好 i.更小的数据类型,占用更少磁盘.内存和CPU缓存,需要的CPU周期更少 ii.如果无法确定哪个数据类型是最好的,就选择不会超过范围的最 ...
- schema与数据类型优化-高性能mysql
总结作为开发人员重点注意的内容!这是一篇有关高性能MYSQL第四章schema相关的笔记. 0.前言 在项目中,数据库表列有两个text字段,用来存储大文本,在数据规模达到40万后,如果查询没命中索引 ...
- mysql笔记01 MySQL架构与历史、Schema与数据类型优化
MySQL架构与历史 1. MySQL架构推荐参考:http://www.cnblogs.com/baochuan/archive/2012/03/15/2397536.html 2. MySQL会解 ...
- MySQL Schema与数据类型优化
Schema与数据类型优化 选择优化的数据类型 1.更小的通常更好 更小的数据类型通常更快,因为它们占用更少的磁盘,内存和CPU缓存 2.简单就好 简单数据类型的操作通常需要更少的CPU周期.例如:整 ...
- Schema 与数据类型优化
这是<高性能 MySQL(第三版)>第四章<Schema 与数据类型优化>的读书笔记. 1. 选择优化的数据类型 数据类型的选择原则: 越小越好:选择满足需求的最小类型.注意, ...
- MySQL之Schema与数据类型优化
选择优化的数据类型 MySQL支持的数据类型非常多,选择正确的数据类型对于获得高性能至关重要.不管存储哪种类型的数据,下面几个简单的原则都有助于做出更好的选择: 更小的通常更好一般情况下,应该尽量使用 ...
- 深入学习MySQL 03 Schema与数据类型优化
Schema是什么鬼 schema就是数据库对象的集合,这个集合包含了各种对象如:表.视图.存储过程.索引等.为了区分不同的集合,就需要给不同的集合起不同的名字,默认情况下一个用户对应一个集合,用户的 ...
随机推荐
- 转SQLSERVER 会不会自动加锁
[SQL]提升查询效率与避免LOCK发生nolock: 可能把没有提交事务的数据也显示出来,可能会产生脏读readpast: 会把被锁住的行不显示出来 所有Select加 With (NoLock)解 ...
- gin框架教程:代码系列demo地址
gin框架教程代码地址: https://github.com/jiujuan/gin-tutorial demo目录: 01quickstart 02parameter 03route 04midd ...
- Git_mergetool_tutorial(转载)
原文链接:https://gist.github.com/karenyyng/f19ff75c60f18b4b8149#table-of-content Table Of Content Skip t ...
- alembic的使用
- query函数的可查询数据
#encoding: utf-8 from sqlalchemy import create_engine,Column,Integer,String,Float,func from sqlalche ...
- Java内存模型(三)原子性、内存可见性、重排序、顺序一致性、volatile、锁、final
一.原子性 原子性操作指相应的操作是单一不可分割的操作.例如,对int变量count执行count++d操作就不是原子性操作.因为count++实际上可以分解为3个操作:(1)读取变量co ...
- Centos磁盘空间不足,找不到占用文件
服务器报警,系统"/"空间不足,但找不到哪些文件占用. 1.使用du -sh *,层层目录查看依然找不到 2.使用"lsof / | grep -i delete&quo ...
- hive自定义udaf函数
自定义udaf函数的代码框架 //首先继承一个类AbstractGenericUDAFResolver,然后实现里面的getevaluate方法 public GenericUDAFEvaluator ...
- Eclipse中导入Maven Web项目并配置其在Tomcat中运行
今天因为实习的关系需要讲公司已经开发的项目导入进Eclipse,而公司的项目是用Maven来构建的所以,需要将Maven项目导入进Eclipse下. 自己因为没有什么经验所以搞了得两个多小时,在这里和 ...
- vue组件添加事件@click.native
1,给vue组件绑定事件时候,必须加上native ,否则会认为监听的是来自Item组件自定义的事件 2,等同于在子组件中: 子组件内部处理click事件然后向外发送click事件:$emit(&q ...