高性能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就是数据库对象的集合,这个集合包含了各种对象如:表.视图.存储过程.索引等.为了区分不同的集合,就需要给不同的集合起不同的名字,默认情况下一个用户对应一个集合,用户的 ...
随机推荐
- 面试题 :10亿url去重只给4G内存
我能想到的有以下几种: 用语言判断去重,ex表格去重,数据库去重,文件名字去重, 有人说:10亿url ex表放不下!! 可以用树和折半的思想将10亿url,变成单元最小化的树,然后用ex表去重 ex ...
- 致远OA利用POC
批量检测url 在脚本同目录下建立url.txt 放入待检测的URL 运行脚本 # Wednesday, 26 June 2019 # Author:nianhua # Blog:https://gi ...
- C# XML操作之一:使用XmlDocument来读写
所有代码都在同一个类中,含有对象 XmlDocument doc = new XmlDocument(); 新建XML,并且写入内容 private void button4_Click(object ...
- AKKA文档2.2(java)——术语,概念
原文:http://doc.akka.io/docs/akka/2.3.6/general/terminology.html 译者:吴京润 本章我们试图建立一个通用的术语列表,用来定义有关并发和分布式 ...
- kafka调优
kafka调优:[root@bi-kafka-1 bin]# pwd/data/kafka-9092/bincat kafka-server-start.sh if [ "x$KAFKA_H ...
- java 利用辗除法求两个整数的最大公约数和最小公倍数
题目:输入两个正整数m和n,求其最大公约数和最小公倍数. 程序分析:利用辗除法. package Studytest; import java.util.Scanner; public class P ...
- PostgreSQL的同步级别与MySQL的半同步after_sync比较
MySQL的半同步中通过binlog进行流复制,同步级别和PostgreSQL对比可以发现: PostgreSQL MySQL off local ...
- <<C++ Primer>> 第 6 章 函数
术语表 第 6 章 函数 二义性调用(ambiguous call): 是一种编译时发生的错误,造成二义性调用的原因时在函数匹配时两个或多个函数提供的匹配一样好,编译器找不到唯一的最佳匹配. 实 ...
- redis 学习(15)-- GEO
GEO GEO 简介 Redis 3.2添加新特性 功能:存储经纬度.计算两地距离.范围计算等 基于ZSet实现 删除操作使用 zrem key member GEO 相关命令 1.geoadd ke ...
- MySql查询进阶
1.1 as关键字 用于 给显示结果中字段 或者 表 起别名 select 别名.字段名 from 表名 as 别名 where 条件语句 # 对字段起别名 select id as '编号', na ...