高性能Mysql--Schema与数据类型优化
目录
选择优化的数据类型
选择数据类型的原则
数据类型
整数
实数
字符串
日期和时间
选择标识符
schema设计中的陷阱
范式和反范式
缓存表和汇总表
物化视图
计算器表
加快ALTER TABLE 操作的速度
只修改.frm文件
CHANGE, MODIFY, 和ALTER 区别
良好的逻辑设计和物理设计是高性能的基石,应该根据系统将要执行的查询来设计schema。
选择优化的数据类型
选择数据类型的原则
- 更小的通常更好
尽量使用可以**正确存储**的**最小**数据类型。
- 简单就好
简单数据类型需要更少CPU周期。
- 尽量避免NULL
可为NULL的列使索引,存储等更复杂。
数据类型
分类 | 类型 | 存储大小(字节) | 范围 | 范围(无符号) |
整数 | tintyint | 1 | (-128,127) | (0,255) |
smallint | 2 | (-32 768,32 767) | (0,65 535) | |
mediumint | 3 | (-8 388 608,8 388 607) | (0,16 777 215) | |
int | 4 | (-2 147 483 648,2 147 483 647) | (0,4 294 967 295) | |
bigint | 8 | ... | ... | |
实数 | float | 4 | ... | ... |
double | 8 | ... | ... | |
decimal(m,n) | 不定 | ... | ... | |
日期和时间 | date | 3 | 1000-01-01/9999-12-31 | |
time | 3 | 838:59:59'/'838:59:59' | ||
year | 1 | 1901-2155 | ||
datetime | 8 | 1000-01-01 00:00:00/9999-12-31 23:59:59 | ||
timestamp | 4 | 1970-01-01 -- 2037 | ||
字符串 | char(m) | m | 0-255字节 | |
varchar(m) | / | 0-65535 字节 | ||
tinyblob,tinytext | 0-255字节 | |||
blob,text | 0-65 535字节 | |||
mediumblob | 2^24 - 1 字节 | |||
mediumtext | ||||
longblob,longtext | 2^32 -1 字节 | |||
位 | bit | n |
不同引擎不同。 innodb,[n/8] |
|
binary(n) | n | n个字节 | ||
varbinary(n) |
整数
整数类型有可选的UNSIGNED 属性,表示不允许负值。
整数类型的选择只决定了MYSQL怎么在内存和磁盘中保存数据,整数计算一般使用64位的bigint,即使32位环境也如此(一些聚合函数例外,使用decimal或double)。
实数
decimal支持精确计算,float和double 由于CPU支持,比decimal更快。decimal在MYSQL 5.0以上被保存在一个二进制中(每4个字节存9个数字)。decimal(18,9)使用9个字节,小数点一个字节,整数部分4个字节,小数部分4个字节。
浮点类型存储同样范围的值时,比decimal节省空间,MYSQL使用double作为浮点计算的类型。
字符串
存储引擎存储char或者varchar值的方式,在内存中和磁盘上可能是不一样。
VARCHAR,可变长,需要1或2个字节存储长度信息。
char存储时,会把末尾空格截断,内部存储时,添加空格,读取出来时,默认空格会发现不存在了。
binary填充时默认填充的是\0,而不是空格。
日期和时间
MYSQL能存储的最小时间粒度为秒。但是MYSQL也可以使用微秒级的粒度进行临时运算。
如果需要微秒计算,则可以用bigint存储时间戳,或者double存储秒之后的小数部分。
除了特殊要求,通常尽量使用timestamp,它比datetime空间效率更高。
选择标识符
为标识列选择合适的数据类型非常重要。不仅考虑存储,还要考虑怎么执行计算和比较。
一旦选择了类型,要确保所有的关联表中关联字段都使用相同类型。
整数类型是个合适的选择。
如果可能避免使用字符串类型作为标识列。
如果是UUID,应该移除‘-’,更好的做法是UNHEX转成16字节数字,存储在binary(16)中。
ORM等产生的SQL会导致很严重的性能问题。
schema设计中的陷阱
- 太多的列
- 太多关联
- 全能枚举
- 变相枚举
- 确实需要NULL,用其他不可用到的值代替,增加复杂度
范式和反范式
根据经验吧
缓存表和汇总表
数据冗余表,提高查询
物化视图
物化视图指事先计算存储在磁盘上的表,MYSQL并不原生支持,可以使用Flexviews。
计算器表
增加更多的slot,以减少并发的机会。
加快ALTER TABLE 操作的速度
Mysql的alter table操作的性能对大表示个问题,Mysql执行大部分修改表的结构操作的方法是用新的结构创建一个空表,从旧表查出数据插入到新表,然后删除旧表。
mysql5.1之后,支持“在线”操作,这些功能不需要在整个操作过程中锁表。最近innodb也支持通过排序来创建索引,这使得索引更快且有个紧凑的索引布局。
不是所有的alter table操作都会引起重建表结构。有2种方法可以改变或者删除一个列的默认值
ALTER TABLE MODIFY COLUMN 将导致表重建。
ALTER TABLE ALTER COLUMN 会直接修改.frm文件不涉及表数据,所以很快。
只修改.frm文件
不受官方支持
CHANGE
, MODIFY
, 和ALTER
区别
ALTER [COLUMN] col_name {SET DEFAULT literal | DROP DEFAULT}
CHANGE [COLUMN] old_col_name new_col_name column_definition
MODIFY [COLUMN] col_name column_definition [FIRST | AFTER col_name]
CHANGE
:可重命名列和修改列的定义
Has more capability than
MODIFY
, but at the expense of convenience for some operations.CHANGE
requires naming the column twice if not renaming it.With
FIRST
orAFTER
, can reorder columns.
MODIFY
:Can change a column definition but not its name.
More convenient than
CHANGE
to change a column definition without renaming it.With
FIRST
orAFTER
, can reorder columns.
ALTER
: Used only to change a column default value.
更多关于alter table 性能问题参考: https://www.cnblogs.com/hllnj2008/p/5045752.html
高性能Mysql--Schema与数据类型优化相关推荐
- 读薄《高性能MySql》(三)索引优化
读薄<高性能MySql>(一)MySql基本知识 读薄<高性能MySql>(二)Scheme与数据优化 读薄<高性能MySql>(三)索引优化 读薄<高性能M ...
- 高性能Mysql之查询性能优化
高性能Mysql之查询性能优化 为什么查询速度会慢 慢查询基础:优化数据访问 重构查询的方式 MySQL查询优化器的局限性 优化特定类型的查询 即使我们设计了一个最优的库表结构,建好了最好的索引,如果 ...
- mysql schema数据混乱_MySQL之Schema与数据类型优化
选择优化的数据类型 MySQL支持的数据类型非常多,选择正确的数据类型对于获得高性能至关重要.不管存储哪种类型的数据,下面几个简单的原则都有助于做出更好的选择: 更小的通常更好 一般情况下,应该尽量使 ...
- mysql eva模型_第四章 Schema 与数据类型优化
1.选择优化的数据类型 更小的通常更好 一般情况下选择可以正确存储数据的最小数据类型.更小的类型通常更快,占用更少的硬盘.内存.CPU等.但要确保没有递归需要存储的值的范围. 简单就好 简单数据类型的 ...
- MySQL Schema与数据类型的优化
选择优化的数据类型: 1. 更小的通常更好: 一般情况下,应该尽量使用可以正确存储数据的最小数据类型.更小的数据类型通常更快,因为他们占用更少的磁盘,内存和cpu缓存,并且处理时需要的cpu周期也更少 ...
- 【MySQL】Schema与数据类型优化
目录 选择优化的数据类型 整数类型 实数类型 字符串类型 日期和时间类型 位置据类型 选择标识符 特殊类型数据 MySQL schema 设计中的陷阱 范式和反范式 缓存表和汇总表 加快 ALTER ...
- 高性能MySQL(4)——查询性能优化
査询优化.索引优化.库表结构优化需要齐头并进,一个不落. 一.为什么查询速度为变慢 在尝试编写快速的查询之前,需要清楚一点,真正重要是响应时间.如果把查询看作是一个任务,那么他由一系列子任务组成,每个 ...
- Mysql高性能笔记(一):Schema与数据类型优化
1.数据类型 1.1.几个参考优化原则 a. 更小的通常更好 i.更小的数据类型,占用更少磁盘.内存和CPU缓存,需要的CPU周期更少 ii.如果无法确定哪个数据类型是最好的,就选择不会超过范围的最 ...
- mysql提高性能 硬件_高性能MySQL–操作系统和硬件优化
许多不同的硬件都可以影响MySQL的性能,但我们认为最常见的两个瓶颈是CPU和I/O资源.当数据可以放在内存中或者可以从磁盘中以足够快的速度读取时,CPU可能出现瓶颈.另一方I/O瓶颈一般发生在工作所 ...
- 高性能MySQL(2)——Schema与数据类型的优化
良好的逻辑设计和物理设计是高性能的基石,应该根据系统将要执行的查询语句来设计 schema,这往往需要权衡各种因素. 一.选择优化的数据类型 MySQL支持的数据类型非常多,选择正确的数据类型对于获得 ...
最新文章
- + ,- (加号,减号) 是数字类型吗?(sql server 2000中)
- 『Numpy』np.ravel()和np.flatten()
- cmw500综合测试仪使用_综合布线中手持式测试仪
- 什么是多任务、进程、线程
- 码表的理解(ASCII,GBK,Unicode,UTF-8等)。
- 代码从stepping stone搬移到内存
- mongodb 查多个不等于_MongoDB增删查
- Python读写Excel简单案例及调试说明文档
- 计算机主板电杆,电脑主板cpu供电上下管怎样区分替换
- Java使用word文档转换图片或pdf格式(aspose-words),无水印,亲测有效!!!
- Relatively Prime Graph(贪心+注意数据范围)
- Keras入门(2)——麻雀虽小,五脏俱全
- 升级OSX High Sierra 10.13遇到一些问题及解决方法
- Windows 中如何远程访问内网计算机
- 阿里云环境(CentOS7.6)部署Zabbix5.0 Agent2
- 超详细的fiddler教程,从小白到精通(五)❤️
- 2016年6月,我们毕业了~~~
- AI之NLP:2020年6月21日北京智源大会演讲分享之15:15-15:40黄萱菁教授《自然语言处理中的表示学习》
- Matlab求出图像中每个细胞的细胞核与核仁面积之比代码
- 计算机教室场地技术条,特殊教育学校功能室建设标准
热门文章
- SpringBoot项目打成jar包后,无法读取resources下的文件
- Go Timer使用方法
- 错误代码: 1054 Unknown column #39;t.createUsrId#39; in #39;group statement#39;
- 如何快速实现Mathematica和Mathtype之间的切换
- python的断点调试
- java的volatile是什么意思
- 代码编辑器揭露性格,你是哪一种?
- visual c 语言参考手册pdf,Microsoft-Visual-C-6-0语言参考手册(三).pdf
- linux cpu平均负载,关于linux系统CPU篇---平均负载
- java 实现网络通信_利用Java怎么样实现网络通信功能