MySQL系列(一)--数据类型
如何选择优化的数据类型:
1、通常更小的更好
相同级别的数据类型,选择占据空间更小的数据类型。更小的数据类型通常更快,因为占用更少的磁盘、内存和CPU缓存,处理时需要的
CPU周期也更少,但是要确保需要存储值的范围
2、简单更好
一个列可以选择多种数据类型
1、有限选择数据类型,整型比字符操作的代价更低
2、其次是日期和二进制类型
3、最后是字符类型
4、使用MySQL内置的类型date、time、datetime而不是String存储时间和日期
5、使用整型存储IP地址
3、尽量避免NULL
1、定义表结构是没有指定列为NOT NULL,默认都是可以为NULL的,除非是真的需要存储NULL值,否则最好指定列为NOT NULL
2、如果查询可为NULL的列,对MySQL来说更难优化,因为可谓NUL的列使索引、索引统计和值比较都更复杂。可为NULL的列使用更多的存储空间,
在MySQL中也要特殊处理。
3、但是InnoDB使用单独的位(bit)存储NULL值,所以对于稀疏数据(很多值为NULL,只有少数行的列有非NULL值)有更好的空间效率,但是不适用于MyISAM
所以,选择数据类型是,第一步需要确认合适的大类型:数字、字符串、时间等。
选择具体类型
MySQL的数据类型可以存储相同类型的数据,只是存储的长度和范围不一样、允许的精度不同、物理空间不同
例如:DATETIME和TIMESTAMP都可以存储时间和日期,但是后者只使用前者一般的存储空间,并且会根绝时区变化,有特殊的自动更新能力。
整数类型:
存储的值的范围从-2^(N-1)到2^(N-1)-1,N为存储的位数
可选UNSIGNED属性,表示不允许负值,大概可以使正数的上线提高一倍,例如TINYINT UNSIGNED存储的范围是0~255,而TINYINT的存储范围
是-128~127
然而整数计算一般使用64位的BIGINT,JISHI ZAI 32位的环境(一些聚合函数是例外)
PS:指定宽度对大多数应用都是无意义的,只是显示字符的个数,对于存储和计算来说,INT(1)和 INT(20)是相同的,不要以为int(2)就是存储
两位,能节省空间。。。
浮点数/实数类型:
float和double类型字段保存数据可以不指定精度,但是decimal类型字段如果不指定精度,默认为(10,0)
CPU不支持DECIMAL的直接计算,而是MySQL服务器本身实现了DECIMAL的高精度计算,相对而言,CPU支持原生浮点极端,所以浮点计算明显更快。
MySQL5.0+将数字打包保存到一个二进制字符串中(每4个字节存9个数字)。例如,DECIMAL(18,9)小数点两边各保存9个数字,一共使用9个字节
,小数点占用1个字节,最多65个数字
浮点型相比DECIMAL存储同样范围的值时,使用更少的空间,所以只有对小数进行精确计算时才使用DECIMAL--例如存储财务数据。但是数据量
很大的时候,可以使用BIGINT代替
PS:浮点型是非精确的数据类型
时间类型:
CURRENT_DATE() 返回当前日期值,不包括时间部分
NOW() 返回时间和日期值
数据类型选择:
当一个列有多种数据类型可以选择,选择顺序:数字类型、日期/二进制类型、字符类型,相同级别的数据类型,优先选择占用空间小的类型
varchar和char:
char会将字符串末尾的空格自动删除,前面的空格不会删除,varchar不会
InnoDB可以把过长的varchar存储为BLOB
varchar节省了存储空间,所以对性能也有帮助。因为varchar是可变的,在update时可能使行变长,就需要额外的工作。
varchar(5)和varchar(200)存储'hello'的空间开销是一样的,那么使用更多的列有什么优势吗?
更长的列会消耗更多的内存,因为MySQL通常会分配固定大小的内存块来保存内布置。尤其是使用内存临时表进行排序或操作时会特别糟糕。
还有利用磁盘临时表进行排序的时候。
所以更好的策略是只分配真正需要的空间。
CHAR使用场景:
1、几乎定长的字符串,例如密码的md5值(定长)、身份证号码等
2、短字符串,例如Boolean类型Y和N,char要1byte,而varchar要2byte,因为还有一个计算长度的额外字节
3、经常更新的字符串列,因为不容易产生碎片
二进制字符串类型:
BLOB和TEXT类型:为存储更大的数据而设计,分别采用二进制和字符方式存储,但是尽量避免使用
字符类型: TINYTEXT/SMALLTEXT/TEXT/MEDIUMTEXT/LONGTEXT
二进制类型: TINYBLOB/SMALLBLOB/BLOB/MEDIUMBLOB/LONGBLOB
两种类型区别:
BLOB类型存储的是二进制数据,没有排序规则(和其它类型的排序不同,通常对每一列的最前max_sort_length字节进行排序,可以根据需求进行
配置或者使用ORDER BY SUSTRING(column,length))和字符集,而TEXT类型有字符集和排序规则
MySQL系列(一)--数据类型的更多相关文章
- MySQL系列--3.数据类型和连接查询
1.存储引擎 数据创建,查询,更新和删除操作都是通过数据引擎来进行的.不同的存储引擎存储限制不同,支持不同的索引机制等. 查询数据库支持的存储引擎 MySQL 5.7.2支持的存储引擎有:InnoDB ...
- MySQL系列:数据类型、运算符及函数(5)
1. 数据类型 MySQL支持多种数据类型,主要有数值类型.日期/时间类型和字符串类型. (1)数值类型:包括整数类型:TINYINT.SMALLINT.MEDIUMINT.INT.BIGINT, ...
- MySQL系列(三)--数据库结构优化
良好的数据库逻辑设计和物理设计是数据库高性能的基础,所以对于数据库结构优化是很有必要的 数据库结构优化目的: 1.减少数据的冗余 2.尽量避免在数据插入.删除和更新异常 例如:有一张设计不得当的学生选 ...
- MySQL系列(一)--基础知识(转载)
安装就不说了,网上多得是,我的MySQL是8.0版本,可以参考:CentOS7安装MySQL8.0图文教程和MySQL8.0本地访问设置为远程访问权限 我的MySQL安装在阿里云上面,阿里云向外暴露端 ...
- 抛砖系列之-MySQL中的数据类型JSON
今天介绍一个MySQL中的数据类型-JSON,相信大家对JSON都不陌生,在日常工作中使用到的频率也很高,话不多说,直接开始. 何谓JSON 看下RFC文档对于JSON的描述 1.基于 JavaScr ...
- MySQL 系列(二) 你不知道的数据库操作
第一篇:MySQL 系列(一) 生产标准线上环境安装配置案例及棘手问题解决 第二篇:MySQL 系列(二) 你不知道的数据库操作 本章内容: 查看\创建\使用\删除 数据库 用户管理及授权实战 局域网 ...
- 屌炸天实战 MySQL 系列教程(二) 史上最屌、你不知道的数据库操作
此篇写MySQL中最基础,也是最重要的操作! 第一篇:屌炸天实战 MySQL 系列教程(一) 生产标准线上环境安装配置案例及棘手问题解决 第二篇:屌炸天实战 MySQL 系列教程(二) 史上最屌.你不 ...
- MySQL 支持的数据类型
1.数值类型 MySQL 支持所有标准 SQL 中的数值类型,其中包括严格数值类型(integer.smallint.decimal.numeric),以及近似数值数据类型(float.real.do ...
- mysql-介绍、MySQL部署、数据类型、存储引擎
数据库介绍 什么是数据? 数据(data)是事实或观察的结果,是对客观事物的逻辑归纳,是用于表示客观事物的未经加工的原始素材.数据是信息的表现形式和载体,可以是符号.文字.数字.语音.图像.视频等. ...
随机推荐
- django 初试
/************************************************************************************** * django 初试 ...
- 逆向分析一个完整的C++程序包含寄存器与参数传递详解
最近在分析C++ dump 文件的时候觉得有必要将一些必要的反汇编东西总结一下以备别人参考,自己有时间的时候也可以进行更多的改进.下面通过一个简单的C++代码转成汇编代码后的详细解释说明一下C++和汇 ...
- CF 757 E Bash Plays with Functions —— 积性函数与质因数分解
题目:http://codeforces.com/contest/757/problem/E 首先,f0(n)=2m,其中 m 是 n 的质因数的种类数: 而且 因为这个函数和1卷积,所以是一个积性函 ...
- bzoj 3481 DZY loves math —— 反演+Pollard_rho分解质因数
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3481 推式子:xy % P = Q 的个数 由于 0 <= x,y < P,所以 ...
- VS2013文件同步插件开发
一.插件功能描述 插件监控一个xml文件,当该文档有添加新元素在保存的时候将新增的元素同步到指定的目录下. 二.模板的选择 由于该功能是跟代码编辑有关的,要监控文档的保存事件,所以要在文档打开的时候就 ...
- [转]python的startswith()方法
描述 Python startswith() 方法用于检查字符串是否是以指定子字符串开头,如果是则返回 True,否则返回 False.如果参数 beg 和 end 指定值,则在指定范围内检查. 语法 ...
- 关于CentOS 7安装jdk1.8
安装之前先检查一下系统有没有自带open-jdk 命令: rpm -qa |grep java rpm -qa |grep jdk rpm -qa |grep gcj 如果没有输入信息表示没有安装. ...
- 从事UNIX/LInux服务器编程最方便的代码编译工具------(eclipse for c/c++)、(FileZilla)、(Secure CRT) 这三种一定要一起使用 之1
今天主要是将前几天搞的Linux学习的心得写出来,希望帮助更多的人进行,方便从事Unix和Linux编程的同行和刚入门者.主要介绍三种工具并给出安装过程,请大家不必怀疑这个博文,此博文是我自己原创.请 ...
- bind: Invalid argument
出现此问题在于,listen函数在socket函数和bind函数之间. 例: /*客户端程序开始建立sockfd描述符*/ listenfd = socket(AF_INET,SOCK_STREAM, ...
- Jmeter常见问题汇总(不断更新ing)
1.测试计划中有多个线程组执行时,为了防止线程组间的相互干扰,需要如下设置一下: 2,接口测试中的上传字段为汉字时需要进行什么形式的转码? 方法一:需要把编码复选框勾选,才能正常通过接口查询数 ...