Mysql高性能笔记(一):Schema与数据类型优化
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与数据类型优化的更多相关文章
- 高性能mysql 第4章 Schema与数据类型优化
基本原则: 更小的通常更好:占用更少的磁盘 内存和cpu缓存.如varchar(2)和varchar(100). 简单就好:比如整形比字符型代价更低.使用日期型来存储日期而不是字符串.使用整形存储ip ...
- 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学习笔记(二)数据类型 补充
原文:Mysql学习笔记(二)数据类型 补充 PS:简单的补充一下数据类型里的String类型以及列类型... 学习内容: 1.String类型 2.列类型存储需求 String类型: i.char与 ...
- MYSQL基础笔记(六)- 数据类型一
数据类型(列类型) 所谓数据烈性,就是对数据进行统一的分类.从系统角度出发时为了能够使用统一的方式进行管理,更好的利用有限的空间. SQL中讲数据类型分成三大类:1.数值类型,2.字符串类型和时间日期 ...
- Mysql学习笔记(一)数据类型
原文:Mysql学习笔记(一)数据类型 学习内容: Mysql基本数据类型. 1.数字类型.. i.整型 Mysql数据类型 含义(有符号) tinyint(m ...
- schema与数据类型优化-高性能mysql
总结作为开发人员重点注意的内容!这是一篇有关高性能MYSQL第四章schema相关的笔记. 0.前言 在项目中,数据库表列有两个text字段,用来存储大文本,在数据规模达到40万后,如果查询没命中索引 ...
- MySQL之Schema与数据类型优化
选择优化的数据类型 MySQL支持的数据类型非常多,选择正确的数据类型对于获得高性能至关重要.不管存储哪种类型的数据,下面几个简单的原则都有助于做出更好的选择: 更小的通常更好一般情况下,应该尽量使用 ...
- 深入学习MySQL 03 Schema与数据类型优化
Schema是什么鬼 schema就是数据库对象的集合,这个集合包含了各种对象如:表.视图.存储过程.索引等.为了区分不同的集合,就需要给不同的集合起不同的名字,默认情况下一个用户对应一个集合,用户的 ...
随机推荐
- LIS3DH三轴加速度计-实现欧拉角(俯仰角,横滚角)
1. LIS3DH管脚定义 PS:LIS3DH和mpu6050的X和Y方向是相反的, mpu6050如下图所示: 2.LIS3DH加速度计介绍 由于LIS3DH只可以得到XYZ加速度,无法获取角速度, ...
- Nginx实现负载均衡功能
一.什么是Nginx? Nginx是一款轻量级的Web 服务器.反向代理服务器.电子邮件(IMAP/POP3)代理服务器. 二.Nginx的优点: 高并发连接:官方测试Nginx能够支撑5万并发连接, ...
- Jetty 开发指南:嵌入式开发示例
Jetty具有嵌入各种应用程序的丰富历史. 在本节中,我们将向您介绍我们的git存储库中的embedded-jetty-examples项目下的一些简单示例. 重要:生成此文档时,将直接从我们的git ...
- Netty中ByteBuf的引用计数线程安全的实现原理
原文链接 Netty中ByteBuf的引用计数线程安全的实现原理 代码仓库地址 ByteBuf 实现了ReferenceCounted 接口,实现了引用计数接口,该接口的retain(int) 方法为 ...
- 章节十一、1-Junit介绍
一.Junit是一个开源的测试框架,在selenium的jar包中,不需要单独安装和搭建环境 二.@BeforeClass:当在方法上加了这个注解的话,这个方法会在这个类的第一个test方法之前运行. ...
- 如何知道一个EXE使用什么开发语言开发的
一般是看EXE调用哪些DLL,这可以使用VC++中的工具Dependency Walker,它可以列出静态链接的所有DLL. 如果EXE中的DLL包括MSVBVM60.DLL,则是使用VB 6.0开发 ...
- Pycharm安装并配置jupyter notebook
Pycharm安装并配置jupyter notebook Pycharm安装并配置jupyter notebook 一: 安装命令jupyter: pip install jupyter 如果缺少依赖 ...
- PHPstorm快捷键Ctrl + Alt + Left 或Right不起作用
最近遇到一个问题,就是安装的phpstorm的回撤快捷键不起作用了,死活用不了!折磨了好久,终于找到解决方法了,具体请看我的github文章: 快捷键Ctrl + Alt + Left 或Right不 ...
- 记录Html+Css流程表格
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- GDB调试指南-变量查看
前言 在启动调试以及设置断点之后,就到了我们非常关键的一步-查看变量.GDB调试最大的目的之一就是走查代码,查看运行结果是否符合预期.既然如此,我们就不得不了解一些查看各种类型变量的方法,以帮助我们进 ...