MySQL Schema与数据类型的优化
选择优化的数据类型:
1、 更小的通常更好:
一般情况下,应该尽量使用可以正确存储数据的最小数据类型。更小的数据类型通常更快,因为他们占用更少的磁盘,内存和cpu缓存,并且处理时需要的cpu周期也更少。
2、 简单就好
简单的数据类型操作通常需要更少的cpu周期。例如,整型比字符操作代价更低,因为字符集和校对规则(排序规则)使字符比较比整型更加复杂。注:应使用mysql内建的类型存储时间和日期,而不是字符串。
3、 尽量避免null
如果查询中包含可为null的列,对Mysql来说更难优化,因为可为null的列使得索引、索引统计和值都比较复杂。可为null的列会使用更多的存储空间,在mysql中也需要特别处理。当可为null的列被索引时,每个索引记录需要一个额外的字节。
通常把可为null的列改为not null带来的性能提升比较小。在调优时,没有必要首先在现有的schema中查找并修改掉这个情况,除非确定这会导致问题。但是如果列上建索引,就应尽量避免设计成可为null的列。
整数类型:
整数类型有TINYINT,SMALLINT,MEDIUMINT,INT,BIGINT。分别使用8,16,24,32,64位存储空间。他们可以存储的值的范围从-2的(n-1)次方到2的(n-1)次方-1,其中n是存储空间的位数。
整数类型有可选的UNSIGNED属性,表示不允许负值,这大致可以是正数的上限提高一倍。例如TINYINT UNSIGNED可以存储的范围是0~255,而TINYINT的存储范围是-128~127。
实数类型:
实数是带有小数部分的数字。然后,他们不仅仅为了存储小数部分;也可以使用DECIMAL存储比BITINT还大的整数。MYSQL既支持精确类型,也支持不精确类型。
DECIMAL类型用于存储精确的小数,因为double类型和float类型在进行计算时,会因为精度损失导致一些数据的偏差。但是DECIMAL数据类型cpu不支持对其直接计算,cpu直接支持原生浮点计算,所以浮点运算明显更快。
因为需要额外的空间和计算开销,所以应该尽量只在对小数进行精确计算时才使用DECIMAL-例如存储财务数据。但是在数据量比较大的时候,可以考虑使用BITINT代替DECIMAL,将需要存储的货币单位根据小数的位数乘以相应的倍数即可。
字符串类型(varchar和char)
- Varchar:
Varchar类型用于存储可变长字符串,是最常见的字符串类型。他比定长类型更节省空间,因为它仅使用必要的空间(例如,越短的字符串使用越少的空间)。所以,varchar节省了存储空间,对性能也有帮助。但是,由于行是边长的,在update是可能使行变得比原来更长,这就导致需要做额外的操作。如果一个行占用的空间增长,并且页内没有更多的空间存储。MyISAM会将行拆成不同的片段存储,InnoDB则需要分裂页来使行可以放进页内。
注:InnoDB更加灵活,它可以把过长的varchar存储为BLOB。
- Char类型:
Char类型适合存储很短的字符串,或者所有值都接近同一个长度。例如,char类型非常适合存储密码的md5值,因为他是定长的值。还有用户的身份证号以及手机号码。对于经常变更的数据,char也比vachar更好,因为定长的char类型不容易产生碎片。对于非常短的列,char也比varchar在存储空间上更有效率。例如用char(1)存储Y和N的值,如果采用单字节字符集只需要一个字节,但是varchar(1)却需要两个字节,因为还有一个记录长度的额外字节。
Varchar(5)和varchar(200)存储‘hello’时空间开销是一样的,但是Varchar(5)会有很大的优势,因为更长的列会消耗更多的内存,因为Mysql通常会分配固定带下的内存块来保存内部值。尤其是使用内存临时表进行排序和操作时会特别糟糕。在利用磁盘临时表进行排序时也同样糟糕。
时间类型
DateTime和TimeStamp
- DateTime
这个类型能保存大范围的值,从1001年到9999年,精度为秒。它把日期和时间封装到格式为YYYYMMDDHHMMSS的整数里,与时区无关。使用8个字节的存储空间。
- TimeStamp:
存储1970年1月1日午夜以来的描述,他和Unix时间戳相同。TimeStamp只使用4个字节的存储空间,因此它的范围比DateTime小的多;只能表示从1970年到2038年。
TimeStamp显示的值也依赖于时区。Mysql服务器,操作系统,以及客户端连接都有时区设置。
TimeStamp也有DATETIME没有的特殊属性。默认情况下,如果插入时没有指定第一个TimeStamp列的值,Mysql会设置这个列的值为当前时间。在插入一行记录时,Mysql默认也会更新第一个TimeStamp列的插入和更新操作。最后,TimeStamp列默认为not null,这也和其他的数据类型不一样。
更多MySQL数据库相关技术请看上海尚学堂《MySQL云数据库服务的架构探索》
MySQL Schema与数据类型的优化的更多相关文章
- MySQL Schema与数据类型优化
Schema与数据类型优化 选择优化的数据类型 1.更小的通常更好 更小的数据类型通常更快,因为它们占用更少的磁盘,内存和CPU缓存 2.简单就好 简单数据类型的操作通常需要更少的CPU周期.例如:整 ...
- MySQL Schema 与数据类型优化
良好的逻辑设计和物理设计是高性能的基石,应该根据系统将要执行的查询语句来设计schema,这往往需要权衡各种因素. 例如,反范式的设计可以加快某些类型的查询,但同时可能使另一些类型的查询变慢:添加计数 ...
- 高性能MySql进化论(一):数据类型的优化_上
在数据库的性能调优的过程中会涉及到很多的知识,包括字段的属性设置是否合适,索引的建立是否恰当,表结构涉及是否合理,数据库/操作系统 的设置是否正确…..其中每个topic可能都是一个领域. 在我看来, ...
- 高性能MySQL笔记 第4章 Schema与数据类型优化
4.1 选择优化的数据类型 通用原则 更小的通常更好 前提是要确保没有低估需要存储的值范围:因为它占用更少的磁盘.内存.CPU缓存,并且处理时需要的CPU周期也更少. 简单就好 简 ...
- mysql笔记01 MySQL架构与历史、Schema与数据类型优化
MySQL架构与历史 1. MySQL架构推荐参考:http://www.cnblogs.com/baochuan/archive/2012/03/15/2397536.html 2. MySQL会解 ...
- MySQL之Schema与数据类型优化
选择优化的数据类型 MySQL支持的数据类型非常多,选择正确的数据类型对于获得高性能至关重要.不管存储哪种类型的数据,下面几个简单的原则都有助于做出更好的选择: 更小的通常更好一般情况下,应该尽量使用 ...
- 第 9 章 MySQL数据库Schema设计的性能优化
前言: 很多人都认为性能是在通过编写代码(程序代码或者是数据库代码)的过程中优化出来的,其实这是一个非常大的误区.真正影响性能最大的部分是在设计中就已经产生了的,后期的优化很多时候所能够带来的改善都只 ...
- MySql Schema 优化
MySQL Schema 优化: 1.保证你的数据库的整洁性. 2.归档老数据 — 删除查询中检索或返回的多余的行 3.在数据上加上索引. 4.不要过度使用索引,评估你的查询. 5 ...
- Schema与数据类型优化
良好的逻辑设计和物理设计是高性能的基石,应该根据系统将要执行的查询数据来设计schema,这往往需要权衡各种因素. MySQL支持的数据类型非常多,选择正确的数据类型对于获得高性能至关重要. 更小的通 ...
随机推荐
- JS判断图片是否加载完成 背景图404 快到碗里来
面对这个问题 我最多做到表面笑嘻嘻 …… 真不知道测试怎么那么…… 啥都能给你测出来 有的没的都能给你测出来 算了算了 谁让本仙女本精灵本可爱温柔大方善解人意呢 …呵呵呵 ————————————正 ...
- position在IE下的问题
盒子设置position:absolute;后,子盒子的浮动可以不做清除浮动处理,同样,使用fixed,子盒子也不需要做清除浮动的处理 在IE7下(据说IE6也不行),盒子设置overflow:hid ...
- golang项目:goa和micro
https://github.com/goadesign/goa http://www.cnblogs.com/zhangqingping/p/5531171.html https://github. ...
- 201621123002《java程序设计》第十二周学习总结
1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多流与文件相关内容. 2. 面向系统综合设计-图书馆管理系统或购物车 使用流与文件改造你的图书馆管理系统或购物车. 2.1 简述如何 ...
- BCode解码练习
在学习BT协议中的一个小练习 参考了 https://github.com/airtrack/bitwave 具体B编码解释 可以自行搜索或者参考 这篇文章 bittorrent 学习(一) 种子文件 ...
- Python_操作邮箱
脚本: from win32com.client import Dispatchimport datetime as dateimport datetimeimport reimport win32c ...
- react-01
比较了半天VUE.Angular.React,最终选择React,下面从几个例子开始React的学习,先从单个的index.html,引用react.js开始 一.最简单的纯JS的代码 <!DO ...
- Xshell连接不上阿里云服务器
心血来潮买了一台1核2g内存,外加40g系统盘的阿里云ecs服务器,在配置xshell连接服务器一直无法连接,试了很多种方法,各种心累,不过最后还是找到了原因,是因为在服务器上没有配置安全组规则,附上 ...
- 阿里巴巴Java编码规范插件安装使用指南
编码规范插件安装使用指南 阿里技术公众号公布的<阿里巴巴Java开发规约>,瞬间引起全民代码规范的热潮,后又发布了PDF的终极版,大家踊跃留言,期待配套的静态扫描工具开放出来. 为了让开发 ...
- 计蒜客 2019 蓝桥杯省赛 B 组模拟赛(三)一笔画
#include<iostream> #include<cstring> #include<cstdio> #include<algorithm> us ...