mysql 优化数据类型
1.更小的通常更好
选择不会超过范围的最小类型
2.简单就好
例如,整型比字符操作代价更低,因为字符集和校对规则(排序规则)使字符比较比整形比较更复杂。
3.尽量避免null
如果查询中包含可为null的列,对mysql来说更难优化,因为可为null的列使得索引,索引统计和值比较 都更复杂。
可为null的列会使用更多的存储空间,在mysql里也需要特殊处理。当可为null的列被索引时,每个索引记录需要一个额外的字节,在myISAM里甚至还可能导致固定大小的索引(例如只有一个整数列的索引)变成可变大小的索引。
通常把可为null的列改为not null 带来的性能提升比较小,所以调优时没必要首先在现有的schema中查找并修改掉这种情况。除非确定这会导致问题。但是,如果计划在列上建索引,就应该避免设计成可为null的列。
也有例外,InnoDB使用单独的bit存储null值,所以对于稀疏数据有很好的空间效率。但这一点不适用于myISAM。
4.整数类型:
tinyint(8),smallint(16),mediumint(24),int(32),bigint(64)
mysql可以为整数类型指定宽度,例如int(11),对大多数应用这是没有意义的:它不会限制值的合法范围,只是规定了mysql的一些交互工具(例如mysql命令行客户端)用来显示字符个数。
实数类型:
不只是为了存储小数部分;也可以使用decimal存储比bigint还大的整数。mysql既支持精确类型,也支持不精确类型。
float和double,是cpu直接支持的浮点计算,所以浮点运算明显更快。
decimal类型用于存储精确的小数。
浮点和decimal类型都可以指定精度。对于decimal列,可以指定小数点前后所允许的最大位数。这会影响列的空间消耗。mysql 5.0和更高版本将数字打包保存到一个二进制字符串中(每4个字节存9个数字)。例如decimal(18,9)小数点两边各存储9个数字,一共使用9个字节:小数点前的数字用4个字节,小数点后的数字用4个字节,小数点本身占一个字节。
有多重方法可以指定浮点列所需的精度,这会使得mysql悄悄选择不同的数据类型,或者在存储时对值进行取舍。这些精度定义是非标准的,所以我们建议只制定数据类型,不指定精度。
因为需要额外的空间和计算开销,所以应该尽量只在对小鼠进行精确计算时才使用decimal例如存储财务数据。在数据量比较大的时候,可以考虑用bigint代替decimal,将需要存储的货币单位根据小数的位数乘以相应的倍数即可。
5.字符串类型:
varchar和char
varchar用于存储可变长字符串,需要使用1或2个额外字节记录字符串的长度;
如果列的最大长度小于或等于255,则只使用1个字节表示,否则用2个字节。节省存储空间,但update更复杂。长度方差大,列的更新少,“使用了像utf-8”这样复杂的字符集,每个字符都使用不同的字节数进行存储更适合用varchar。
innodb可以把过长的varchar存储为blob。
char适合存储很短的字符串,或所有值都接近同一个长度。例如密码的md5值。
填充和截取空格的行为在不同的存储引擎都是一样的,因为这是在mysql服务器层进行处理的。
binary和varbinary
binary和varbinary存储的是二进制字符串。二进制字符串跟常规字符串非常相似,但是二进制存储的是字节码而不是字符。填充也不一样:mysql填充binary采用的是\0(零字节)而不是空格,在检索时也不会去掉填充值。mysql比较binary字符串时,每次按一个字节,并且根据该字节的数值进行比较。因此二进制比较比字符比较简单很多,所以也就更快。
blob和text类型
blob和text都是为存储很大的数据而设计的字符串数据类型,分别采用二进制和字符方式存储。
与其他类型不同,mysql把每个blob和text当作一个独立的对象处理。存储引擎在存储时通常会做特殊处理。当blob和text值太大时,innodb会使用专门的“外部”存储区域进行存储,此时每个值在行内需要1-4字节存储一个指针,然后在外部存储区域存储世纪的值。
blob存储二进制数据,没有排序规则或字符集,而TEXT类型有字符集和排序规则。
与其他类型不同在排序时,只对每个列的最前max_sort_length字节而不是真个字符串做排序。
memory不支持blob和text类型。尽量避免使用这2种。
使用枚举代替字符串类型
实际存储的是整数而非字符串,排序也是按整数排。其在于enum关联时效率较高,但是与varchar关联比varchar关联varchar还要慢。
启发:在“查找表”时采用证书主键而避免采用基于字符串的值进行关联。
日期和时间类型
mysql能存储的最小时间粒度为秒
datetime和TIMESTAMP
datetime吧日期和时间封装到格式为YYYMMDDHHMMSS的整数中,与时区无关。使用8个字节的存储空间。1001-9999
默认情况下mysql以一种可排序的,无歧义的格式显示DATETIME值。例如“2008-01-16 22:37:00”
TIMESTAMP
4字节只能表示1970-2038年,显示的值依赖于时区。默认情况下,如果插入时没有指定第一个timestamp列的值,mysql则设置这个列为当前时间。在插入一行记录时,mysql默认也会更新第一个timestamp列的值(除非在update语句中明确指定了值)。timestamp列默认为not null。
mysql 优化数据类型的更多相关文章
- MySQL优化之表结构优化的5大建议(数据类型选择讲的很好)
殊不知,在N年前被奉为"圣经"的数据库设计3范式早就已经不完全适用了.这里我整理了一些比较常见的数据库表结构设计方面的优化技巧,希望对大家有用. 由于MySQL数据库是基于行(Ro ...
- MySQL 性能优化--优化数据库结构之优化数据类型
MySQL性能优化--优化数据库结构之优化数据类型 By:授客 QQ:1033553122 优化数字数据(Numeric Data) l 对于唯一ID或其它可用字符串或数字表示的值,选择 ...
- Mysql优化系列(2)--通用化操作梳理
前面有两篇文章详细介绍了mysql优化举措:Mysql优化系列(0)--总结性梳理Mysql优化系列(1)--Innodb引擎下mysql自身配置优化 下面分类罗列下Mysql性能优化的一些技巧,熟练 ...
- mysql怎样建表及mysql优化
1.符合数据库三范式 2.字段选择合适的数据类型 3.注意表之间的联系,一对多,多对多,一对一 4.拆分表,把不常用的字段单独成表. 5.建立索引,哪些字段建立索引?建立索引的原则?最左前缀原则,wh ...
- 数据库 mysql 优化器原理
MySQL查询优化器有几个目标,但是其中最主要的目标是尽可能地使用索引,并且使用最严格的索引来消除尽可能多的数据行. 你的最终目标是提交SELECT语句查找数据行,而不是排除数据行.优化器试图排除数据 ...
- MYSQL 优化建议
转自 http://coolshell.cn/articles/1846.html MYSQL 优化建议20条 1. 为查询缓存优化你的查询 大多数的MySQL服务器都开启了查询缓存.这是提高性最有效 ...
- mysql优化--博森瑞
http://blog.itpub.net/28916011/viewspace-1758440/ 现在说一下mysql的内存和I/O方面的两个特点. 一. mysql内存特点: 1. 也有全局内存 ...
- Mysql优化相关总结
Mysql优化相关总结 2016-05-31 数据库集中营 优化顺序: 选择适当的引擎和表结构和数据类型 建立索引,优化sql. 增加缓存,redis.memcache. 主从.主主,读写分离. my ...
- MySql优化方案
mysql优化方案总结 u Mysql数据库的优化技术 对mysql优化时一个综合性的技术,主要包括 a: 表的设计合理化(符合3NF) b: 添加适当索引(index) [四种: 普通索 ...
随机推荐
- java的“同一”与“相等”
变量:引用(指向地址) + 值(该变量指向值所储存的那一片内存) 两个变量同一 : 判断 是否 这两个变量指向同一片内存. 两个变量相等 : 判断 是否 这两个变量的类型相同,且值相等. 注:常用的& ...
- 项目开发中的pro、pre、test、dev环境及SpringBoot多环境配置
一.介绍: pro:生产环境,面向外部用户的环境,连接上互联网即可访问的正式环境. pre:灰度环境,外部用户可以访问,但是服务器配置相对低,其它和生产一样. test:测试环境,外部用户无法访问,专 ...
- Java学习的第一天
1.今天安装了Java操作环境,并运行了helloworld的程序 2.在安装过程中,文件路径丢了,与c++和c之前的差异使我难堪 3.明天准备完成小学期任务以及继续往下学习Java语言读大道至简
- DataStructure-enum枚举
Enum:枚举类型 enum模块定义了一个提供迭代和比较功能的枚举类型.可以用这个模块为值创建明确定义的符号,而不是使用字面量整数或字符串. 创建枚举 可以使用class派生Enum,然后增加描述值得 ...
- GANSS 87C键盘在Linux无法正常使用的解决办法
前几天在狗东入手可以一把GANSS的87C键盘,满心欢喜拆开来用却发现在开发电脑(Deepin和ubuntu)上F1-F12都不能正常使用,这对一个搞web开发的人来说,无疑是要了我的老命,无奈找各种 ...
- MySQL全面瓦解6:查询的基本操作
概述 提到查询,就回到我们第四篇的SQL语言分类了,DQL(Data QueryLanguage),也就是数据查询语言,实际就是从数据库中获取数据的一种命令方式.我们给数据库发送一个查询语句的命令,数 ...
- Java入门(6)
阅读书目:Java入门经典(第7版) 作者:罗格斯·卡登海德 当方法在子类和超类都定义了时,将使用子类的定义:因此子类可以修改,替换或完全删除超类的行为或属性. 关键字super引用对象的上一级超类, ...
- 不停机不更新代码线上调试BUG的工具
如果你有以下痛点,请你查看本文章: 1.我改的代码为什么没有执行到?难道是我没 commit?分支搞错了? 2.遇到问题无法在线上 debug,难道只能通过加日志再重新发布吗? 3.线上遇到某个用户的 ...
- SVG--D3--血缘关系树
最近的工作与可视化有关,有展示血缘关系树的需求 ,类似于这样: 碰巧搜到 D3(用于可视化的js库,作者吕之华),瞬间无法自拔,它的树状图功能基于SVG.js ,暴露的可操作入口也简洁恰当,能帮助你快 ...
- 【T1543.003】利用 ACL 隐藏恶意 Windows 服务
看到一篇文章讲述了通过设置 DACL 隐藏 Windows 服务信息,便做一下总结. 技术原理 系统中每个 Service 在 Windows 中属于都一种对象(Object),用户在访问对象时的权限 ...