数据库优化第一步:数据类型
在IT行业这个发展更新速度很快的行业,只有不停止的学习,才不会被行业所淘汰。如果你是数据库学习者,那么本文《数据库优化第一步:数据类型》就很适合你!本篇内容主要包括数据库优化第一步:数据类型,希望对大家的知识积累有所帮助,助力实战开发!
阅读原文:数据库优化第一步:数据类型
为什么选择合适的数据类型很重要?因为数据类型会影响存储空间的开销,也会影响数据的查询效率,可以说这是你优化数据库的第一步要做的事情。
疑问
本文的前提环境是:MySQL 5.7 , UTF-8 Unicode
char与varchar的区别和选择?
- CHAR是固定长度,长度范围为0-255字符,存储时,如果字符数没有达到定义的位数,会在后面用空格补全存入数据库中,比指定长度大的值将被截短。
- VARCHAR是变长长度,长度范围为0-21845(utf8)或16383(utf8mb4)字符,存储时,如果字符没有达到定义的位数,也不会在后面补空格,当然还有一或两个字节来描述该字节长度
varchar(10) 括号中的数字代表 字节 还是 字符 ?
代表的是字符,无论英文或中文 都可以存储10个字符。
int(5) 括号中的数字代表 什么 ?
数字5并不是代表存储的长度,int型的长度是4字节固定的,括号里的数字仅仅代表最小显示的宽度。
- 那我们设置它的意义何在呢?
其实当我们长度超过5的时候它是没用的,和没有设置一样,当长度没有超过5时,并且设置了zerofill(填充零),它会在不足的从左侧填充零,假如插入了数字 22 ,那么显示的是 00022 (navicat不显示,可在cmd中查看)。
所以你指定的数字和它的大小及存储的空间没有关系。
int 括号中的数字为什么默认11或10 ?
int有符号数最小值:
-2 1 4 7 4 8 3 6 4 8总共11位
2 1 4 7 4 8 3 6 4 7总共10位
所以你懂得…… 其它的整数类型以此类推。
现在为什么很少使用CHAR ?
因为我们使用的是 InnoDB存储引擎,内部的行存储格式没有区分固定长度和可变长度列(所有数据行都使用指向数据列值的头指针),因此在本质上,使用固定长度的CHAR列不一定比使用可变长度VARCHAR列简单。
| Value | CHAR(4) | 实际存储 | VARCHAR(4) | 实际存储 |
|---|---|---|---|---|
| '' | ' ' | 4 bytes | '' | 1 bytes |
| 'ab' | 'ab ' | 4 bytes | 'ab' | 3 bytes |
| 'abcd' | 'abcd' | 4 bytes | 'abcd' | 5 bytes |
| 'abcdef' | 'abcd' | 4 bytes | 'abcd' | 5 bytes |
可以用上表来表示,当定义char时,不管你存入多少字符,都会占用到你定义的字符数,而用varchar时,则和你输入的字符数有关,会多一到两个字节来记录字节长度,当数据位占用的字节数小于255时,用1个字节来记录长度,数据位占用字节数大于255时,用2个字节来记录长度,还有一位来记录是否为nul值
我平时会把这篇总结当做一个字典,每次设计数据库时忘记了会拿出来看下。
MySQL支持的数据类型主要分为3类:
- 数值类型
- 字符串类型
- 日期时间类型
数值类型
整数型
1byte = 8bit 关于位的计算可参考我的另一篇文章《位运算》
| 类型 | 存储(byte) | 符号 | 最小值(公式) | 最大值(公式) |
|---|---|---|---|---|
| tinyint | 1 | 有 | -128 (-27) | 127 (27-1) |
| 无 | 0 | 255 (28-1) | ||
| smallint | 2 | 有 | -32768 (-215) | 32767 (215-1) |
| 无 | 0 | 65535 (216-1) | ||
| mediuint | 3 | 有 | -8388608 (-223) | 8388607 (223-1) |
| 无 | 0 | 16777251 (224) | ||
| int | 4 | 有 | -2147483648 (-231) | 2147483647 (231-1) |
| 无 | 0 | 4294967295 (232-1) | ||
| bigint | 8 | 有 | -9223372036854775808 (-263) | 9223372036854775807 (263-1) |
| 无 | 0 | 18446744073709551615 (264-1) |
定点型
使用方式:即
DECIMAL(M,D)
- M 表示十进制数字总的个数
- D 表示小数点后面数字的位数
- M的默认取值为10,D默认取值为0。如果创建表时,某字段定义为decimal类型不带任何参数,等同于decimal(10,0)。带一个参数时,D取默认值。
M的取值范围为1~65,取0时会被设为默认值,超出范围会报错。
D的取值范围为0~30,而且必须
所以,很显然,当M=65,D=0时,可以取得最大和最小值。
举例
例如: DECIMAL(5,2)
范围: -999.99 到 999.99
如果存储时,整数部分超出了范围(如上面的例子中,添加数值为1000.01),就会报错,不允许存这样的值。
如果存储时,小数点部分若超出范围,就分以下情况:
- 若四舍五入后,整数部分没有超出范围,则只警告,但能成功操作并四舍五入删除多余的小数位后保存。如999.994实际被保存为999.99。
- 若四舍五入后,整数部分超出范围,则报错,并拒绝处理。如999.995和-999.995都会报错。
浮点型
| MySQL数据类型 | 含义 |
|---|---|
| float(m,d) | 单精度浮点型 8位精度(4字节) m总个数,d小数位 |
| double(m,d) | 双精度浮点型 16位精度(8字节) m总个数,d小数位 |
浮点数是用来表示实数的一种方法,它用 M(尾数) * B( 基数)的E(指数)次方来表示实数,相对于定点数来说,在长度一定的情况下,具有表示数据范围大的特点,但同时也存在误差问题。如果希望保证值比较准确,推荐使用定点数数据类型。
举例
例如: float(7,4)
范围: -999.9999 到 999.9999
MySQL保存值时进行四舍五入,因此如果在FLOAT(7,4)列内插入999.00009,近似结果是999.0001。
float和double中的M和D的取值默认都为0,即除了最大最小值,不限制位数。允许的值理论上是-1.7976931348623157E+308~-2.2250738585072014E-308、0和2.2250738585072014E-308~1.7976931348623157E+308。
M、D范围:
- M取值范围为0~255。FLOAT只保证6位有效数字的准确性,所以FLOAT(M,D)中,M
- D取值范围为0~30,同时必须
FLOAT和DOUBLE中,若M的定义分别超出7和17,则多出的有效数字部分,取值是不定的,通常数值上会发生错误。因为浮点数是不准确的,所以我们要避免使用“=”来判断两个数是否相等。
字符串型
字符串类型指CHAR、VARCHAR、BINARY、VARBINARY、BLOB、TEXT、ENUM和SET。
| 类型名称 | 说明 | 存储需求 |
|---|---|---|
| CHAR(M) | 固定长度的非二进制字符串 | M字符,1 |
| VARCHAR(M) | 变长的非二进制字符串 | M字符,1 |
| ENUM | 枚举类型,只能有一个枚举字符串值 | 1或2个字节,取决于枚举值的数目(最大值是65535) |
| SET | 一个设置,字符串对象可以有零个或多个SET成员 | 1,2,3,4或8个字节,取决于集合成员的数量(最多64个成员) |
| TINYTEXT | 非常小的非二进制字符串 | L+1个字节,这里L8 |
| TEXT | 小的非二进制字符串 | L+2个字节,这里L16 |
| MEDIUMTEXT | 中等大小的非二进制字符串 | L+3个字节,这里L24 |
| LONGTEXT | 大的非二进制字符串 | L+4个字节,这里L32 |
日期和时间型
| MySQL数据类型 | 字节长度 | 含义(格式) | 范围 |
|---|---|---|---|
| date | 3 | 日期 YYYY-MM-DD | '1000-01-01'到 '9999-12-31' |
| time | 3 | 时间 HH:MM:SS | '-838:59:59'到'838:59:59' |
| year | 1 | 年YYYY | 1901到2155 |
| datetime | 8 | 日期时间 YYYY-MM-DD HH:MM:SS | '1000-01-01 00:00:00'到'9999-12-31 23:59:59' |
| timestamp | 4 | 自动存储记录修改时间YYYY-MM-DD HH:MM:SS | '1970-01-01 00:00:01' UTC 到'2038-01-19 03:14:07' UTC |
日期类型的选择
- 如果你的应用不牵涉到时区/国际业务,那么你最好选择datetime/timestamp,可读性高,统计方便。
- 如果你的应用牵涉的时区或国际业务,你们建议你使用bigint/timestamp来存储时间戳,这样没有时区的困扰,但bigint可读性差。
- 如果你认为你的应用能够运行到2037年以后,那么别用timestamp。
选择合适的类型
这里指的是数据列的数据类型,在选择合适的数据类型时,我们应满足以下条件:
- 尽量选择小,简单的数据类型。
- 保持可读性。
- 尽量避免Null

欢迎关注公众号交流!

参考
https://dev.mysql.com/doc/ref...
https://dev.mysql.com/doc/ref...
https://www.edureka.co/blog/m...
https://stackoverflow.com/que...
https://blog.csdn.net/vkingne...
到这里,我们也就讲完了《数据库优化第一步:数据类型》的内容了。个人认为,基础知识的学习和巩固,是为了更好的将其运用到项目中,欢迎关注golang学习网公众号,带你了解更多关于mysql的知识点!
MySQL数据表合并去重
- 上一篇
- MySQL数据表合并去重
- 下一篇
- mysql利用表对象数据文件恢复数据
-
- 数据库 · MySQL | 1天前 |
- MySQL数值函数大全及使用技巧
- 117浏览 收藏
-
- 数据库 · MySQL | 2天前 |
- 三种登录MySQL方法详解
- 411浏览 收藏
-
- 数据库 · MySQL | 3天前 |
- MySQL数据备份方法与工具推荐
- 420浏览 收藏
-
- 数据库 · MySQL | 3天前 |
- MySQL数据备份方法与工具推荐
- 264浏览 收藏
-
- 数据库 · MySQL | 4天前 |
- MySQL索引的作用是什么?
- 266浏览 收藏
-
- 数据库 · MySQL | 5天前 |
- MySQL排序原理与实战应用
- 392浏览 收藏
-
- 数据库 · MySQL | 1星期前 |
- MySQLwhere条件查询技巧
- 333浏览 收藏
-
- 数据库 · MySQL | 1星期前 |
- MySQL常用数据类型有哪些?怎么选更合适?
- 234浏览 收藏
-
- 数据库 · MySQL | 1星期前 |
- MySQL常用命令大全管理员必学30条
- 448浏览 收藏
-
- 数据库 · MySQL | 1星期前 |
- MySQL高效批量插入数据方法大全
- 416浏览 收藏
-
- 数据库 · MySQL | 1星期前 |
- MySQL性能优化技巧大全
- 225浏览 收藏
-
- 数据库 · MySQL | 1星期前 |
- MySQL数据备份4种方法保障安全
- 145浏览 收藏
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 543次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 516次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 500次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 485次学习
-
- ChatExcel酷表
- ChatExcel酷表是由北京大学团队打造的Excel聊天机器人,用自然语言操控表格,简化数据处理,告别繁琐操作,提升工作效率!适用于学生、上班族及政府人员。
- 3163次使用
-
- Any绘本
- 探索Any绘本(anypicturebook.com/zh),一款开源免费的AI绘本创作工具,基于Google Gemini与Flux AI模型,让您轻松创作个性化绘本。适用于家庭、教育、创作等多种场景,零门槛,高自由度,技术透明,本地可控。
- 3375次使用
-
- 可赞AI
- 可赞AI,AI驱动的办公可视化智能工具,助您轻松实现文本与可视化元素高效转化。无论是智能文档生成、多格式文本解析,还是一键生成专业图表、脑图、知识卡片,可赞AI都能让信息处理更清晰高效。覆盖数据汇报、会议纪要、内容营销等全场景,大幅提升办公效率,降低专业门槛,是您提升工作效率的得力助手。
- 3403次使用
-
- 星月写作
- 星月写作是国内首款聚焦中文网络小说创作的AI辅助工具,解决网文作者从构思到变现的全流程痛点。AI扫榜、专属模板、全链路适配,助力新人快速上手,资深作者效率倍增。
- 4506次使用
-
- MagicLight
- MagicLight.ai是全球首款叙事驱动型AI动画视频创作平台,专注于解决从故事想法到完整动画的全流程痛点。它通过自研AI模型,保障角色、风格、场景高度一致性,让零动画经验者也能高效产出专业级叙事内容。广泛适用于独立创作者、动画工作室、教育机构及企业营销,助您轻松实现创意落地与商业化。
- 3784次使用
-
- golang MySQL实现对数据库表存储获取操作示例
- 2022-12-22 499浏览
-
- 搞一个自娱自乐的博客(二) 架构搭建
- 2023-02-16 244浏览
-
- B-Tree、B+Tree以及B-link Tree
- 2023-01-19 235浏览
-
- mysql面试题
- 2023-01-17 157浏览
-
- MySQL数据表简单查询
- 2023-01-10 101浏览

