MySql字段类型的选择
1.主键设计
主键不要与业务逻辑有所关联,最好是毫无意义的一串独立不重复的数字,且自增,最好设计为Long类型,对应MySQL的bigint
bigint详解: MySQL_bigint(20) 是什么意思? - 根号829 - 博客园
2.关于外键
尽量不要建立外键,保证每个表的独立性。如果非得保持一定的关系,最好是通过id进行关联,我们使用业务进行管理,否则每次删除或更新都会关联查询,性能差,可以把这个逻辑放在业务层里,避免额外的查询
3.动静分离
最好做好静态表和动态表的分离。这里解释一下静态表和动态表的含义,静态表:存储着一些固定不变的资源,比如城市/地区名/国家(静态表一定要使用缓存)。动态表:一些频繁修改的表
这样做的好处是当我根据主键查询所需的数据时,根据id到磁盘查找出这条数据即可,当作了动静分离后,这次取出的数据就是经常修改的那部分数据,而不经常修改的数据在另一个表中,物理上不相邻,这次用不到就不会被取出
4.资源存储
数据库不要存储任何资源文件,比如照片/视频/网站等,可以用文件路径/外链用
5.字段长度
建表的时候,字段长度尽量要比实际业务的字段大3-5个字段左右(考虑到合理性和伸缩性),最好是2的n次方幂值。不能建比实际业务太大的字段长度(比如订单id如果考虑要业务增长的话,一定要使用Long型,对应的数据库的数据类型是bigint),这是因为如果字段长度过大,在进行查询的时候索引在B-Tree树上遍历会越耗费时间,从而查询的时间会越久;但是绝对不能建小,否则mysql数据会报错,程序会抛出异常;
6.时间字段的选择
使用 TIMESTAMP(4 个字节) 或 DATETIME 类型 (8 个字节) 存储时间
DATETIME
使用8字节存储,可以保存大范围的值,从1001~9999年
TIMESTAMP
使用4字节存储,保存范围比DATETIME小,从1970~2038年
TIMESTAMP 占用 4 字节和 INT 相同,但比 INT 可读性高
超出 TIMESTAMP 取值范围的使用 DATETIME 类型存储
经常会有人用字符串存储日期型的数据(不正确的做法)
•缺点 1:无法用日期函数进行计算和比较
•缺点 2:用字符串存储日期要占用更多的空间
7.尽量使用数字型字段,若只含数值信息的字段尽量不要设计为字符型
相对于数字型字段,字符型会降低查询和连接的性能,并会增加存储开销
8.字符类型的选择
尽可能使用varchar/nvarchar 代替 char/nchar
varchar(50)表示的是设置可以存储的最大字符串长度为50个字节,并且字符是变长的,如果不满50个就是根据实际存储的字节来确定的。
1>最大长度:
char最大长度是255字符,varchar最大长度是65535个字节。
2>定长:
char是定长的,不足的部分用隐藏空格填充,varchar是不定长的。
3>空间使用:
char会浪费空间,varchar会更加节省空间。
4>查找效率:
char查找效率会很高,varchar查找效率会更低。
5>尾部空格:
char插入时可省略,vaechar插入时不会省略,查找时省略。
6>varchar(n)需要1到2个额外字节记录长度n的值
当n<=255的时候,只需要1个字节记录即可(数据表示范围:0 ~ (2^8-1),即0~255);当n>255的时候,则需要2个字节存储n的值((2^8)~ (2^16)-1,即256~65535)。
varchar字段报错的实际值得长度保存在第一个或者前两个字节中。
所以:
a.如果varchar(20),实际是需要1+20个字节的存储空间;
b.如果varchar(255),实际是需要1+255个字节的存储空间;
c.如果varchar(256),实际是需要2+256个字节的存储空间;
d.如果varchar(500),实际是需要2+500个字节的存储空间.
9.每种类型字段后面,指定长度如何指定
这个数字不是字节数,而是长度
mysql bigint(20)中20指的是:该字段下能输出显示的最大数字长度。
括号里的数字叫数据的宽度,不同的数据类型对宽度的处理也不一样:
1> 整数类型:这里显示的宽度和数据类型的取值范围是没有任何关系的,显示宽度只是指明Mysql最大可能显示的数字个数,数值的位数小于指定的宽度时会由空格填充;
如果插入了大于显示宽度的值,只要该值不超过该类型的取值范围,数值依然可以插入,而且能够显示出来。
如果你不设置宽度,系统将添加默认的宽度tinyint(4)、smallint(6)、mediumint(9)、int(11)、bigint(20),这些默认的宽度是跟该类型的取值范围长度相关。
2> 字符串类型:字符串类型这个宽度才真的用上了。不管是char还是varchar,宽度都定义了字符串的最大长度;例如上面的 password varchar(20),如果你输入了一个21个字符的密码,那么保存和显示的只会是前20个字符,你将丢失一个字符信息,char同理。由于varchar是变长存储的,所以实际开发中我们一般都把varchar的宽度设为最长255,它会根据实际数据长度变化,反正你没用完它也不会浪费空间。char是定长存储,定义多长就是多长。
3> 浮点和日期等数据类型:对数据的宽度没有要求,一般也不设置,默认是0
10.IP地址在MySQL中如何存
1>只存储ipv4 可以用一个int类型的字段来存储,MySQL也提供了用于将其转换成字符串的函数,但这个时候和IPv4无法兼容
MySQL中INET_ATON()、INET_NTOA函数_doublefay的专栏-CSDN博客_inet_aton
2>同时存储IPV6和IPV4还使用varchar吧
https://baike.baidu.com/item/IPv6/172297?fr=aladdin
11.浮点数的选择
MySQL如何选择float, double, decimal - 图生 - 博客园
CREATE TABLE test_order (id INT AUTO_INCREMENT PRIMARY KEY,description VARCHAR(255),cost DECIMAL(19,4) NOT NULL
);
12.尽量使用 not null
在mysql数据库中,“NULL” 和 “空值(空字符串)”是不一样的。NULL是一种比较特殊的数据类型,这也可以解释为什么字段设置为NOT NULL,却可以插入空值。空值是不占用空间的,而NULL需要占用空间。
在平常我们设计数据库时,如果是索引字段,一定要定义为 NOT NULL 。因为 NULL 值会影响优化器对索引的选择,索引效率会下降很多。虽然表中允许 NULL 列,但其他字段也尽量定义为 NOT NULL 。 mysql 在进行比较的时候,NULL 会参与字段比较。因为 NULL 是一种比较特殊的数据类型。数据库在处理的时候需要进行特殊的处理。如此的话,就会增加数据库处理记录的复杂性。当表中有比较多的空字段时,在同等条件下,数据库处理的性能会降低许多。
在往数据表插入数据时,如果一直不能保证该字段一定有值,可以借鉴以下解决方法:
1)通过设置默认的形式,定义时使用DEFAULT " 或 DEFAULT 0,来避免空字段的产生。
2)若一张表中,允许为空的列比较多,接近全部列数的三分之一,而且这些列在大部分情况下都可有可无,可以考虑另外建立一张附表,以保存这些列。
MySql字段类型的选择相关推荐
- MySQL字段类型如何选择?
前言 MySQL 中有很多字段类型,比如整数.文本.浮点数,等等.如果类型定义合理,就能节省存储空间,提升数据查询和处理的速度:如果数据类型定义不合理,就有可能会导致数据超出取值范围,引发系统报错,甚 ...
- php数据库字段类型,mysql 字段类型说明
mysql 字段类型说明 更新时间:2007年04月27日 00:00:00 作者: MySQL支持大量的列类型,它可以被分为3类:数字类型.日期和时间类型以及字符串(字符)类型.本节首先给出可用 ...
- MySQL字段类型解析
前言: 要了解一个数据库,我们必须了解其支持的数据类型.MySQL 支持大量的字段类型,其中常用的也有很多.前面文章我们也讲过 int 及 varchar 类型的用法,但一直没有全面讲过字段类型,本篇 ...
- MySQL字段类型详解
MySQL字段类型详解 2009-01-05 09:25 来源:泡菜博客 0个评论 分享文章 A- A+ 百度权重查询 词库网 网站监控 服务器监控 SEO监控 Swift编程语言教程 MySQL支持 ...
- MySQL字段类型对应Java字段
前言 MySQL Connector/J 对于 MySql 数据类型和 Java 数据类型之间的转换是很灵活的: 一般来讲,任何 MySql 数据类型都可以被转换为一个 java.lang.Strin ...
- MySql 字段类型对应 Java 实体类型
前言 MySQL Connector/J 对于 MySql 数据类型和 Java 数据类型之间的转换是很灵活的: 一般来讲,任何 MySql 数据类型都可以被转换为一个 java.lang.Strin ...
- 原 hibernate与mysql字段类型对应关系
原 hibernate与mysql字段类型对应关系 发表于8个月前(2015-04-17 08:56) 阅读(1102) | 评论(0) 2人收藏此文章, 我要收藏 赞0 1月16日厦门 OSC ...
- MySQL 字段类型解析
MySQL字段类型 MySQL支持多种类型,大致可以分为三类:数值.日期/时间和字符串(字符)类型. 数值类型 字符串 char和varchar: 1.char(n) 若存入字符数小于n,则以空格补于 ...
- MySQL字段类型与Java中类型的对应
MySQL字段类型与Java中类型的对应 在设计数据的时候,需要与Java里的类型进行匹配,我自己在设计过程中参考的内容如下 编号 类型名称 显示长度 数据库类型 Java类型 备注/描述 0 VAR ...
最新文章
- c++ 获取64位进程模块地址_针对银行木马BokBot核心模块的深入分析
- 计算机软件基础-(软件开发过程管理)
- 在SAP WebClient UI里显示倒数计时的UI
- npm --- 包的发布与导入
- [转载] Java9发布回顾Java 8的十大新特性
- 对象数组快速掌拨 java 0913
- easyui源码翻译1.32--SearchBox(搜索框)
- Python使用模块中对象的几种方法
- java方法重写和super关键字
- python必背入门代码-Python零基础入门学习笔记(一)
- 更轻量级的Semaphore、AutoResetEvent、ThreadPool
- 微型计算机原理及应用贾金铃,计算机科学与技术专业本科系列教材·微型计算机原理及应用:理论、实验、课程设计...
- IDEA 配置log4j
- css timeline,一个非常漂亮的时间轴样式timeLine
- Linux deepin 15.11设置:输入时禁用触摸板
- realme发布最便宜5G手机,心生不忿的小米强调体验不好
- 机器学习之PQ量化算法
- Javaweb入门基础(尚硅谷,佟刚老师)笔记(一)
- Qt输出4位大字十六进制,不足4位左边补0
- Vmare安装使用教程