MySql字段类型的选择

MySql字段类型的选择主键设计主键不要与业务逻辑有所关联 最好是毫无意义的一串独立不重复的数字 且自增 最好设计为 Long 类型 对应 MySQL 的 bigintbigint 详解 MySQL bigint 20 是什么意思 根号 829 博客园 2 关于外键尽量不要建立外键 保证每个表的独立性 如果非得保持一定的关系 最好是通过 id 进行关联 我们使用业务进行管理 否则每次删除或更新都会关联查询 性能差 可以把这个逻辑放在业务层里 避免额外的查询 3 动静分离最好做好静态表和动态

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)。

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/?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)若一张表中,允许为空的列比较多,接近全部列数的三分之一,而且这些列在大部分情况下都可有可无,可以考虑另外建立一张附表,以保存这些列。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/214165.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月18日 下午4:50
下一篇 2026年3月18日 下午4:50


相关推荐

  • 微商分销代理商城源码带代理等级和升级条件 thinkphp框架「建议收藏」

    微商分销代理商城源码带代理等级和升级条件 thinkphp框架「建议收藏」  介绍:微商分销代理商城源码基于think框架开发是一款微商分销代理商城源码,可以自己设置代理等级和升级条件(如购买指定商品、消费额度)网站搭建方式介绍:测试环境php7.0+mysql5.6数据库配置文件applicationdatabase.php后台/admin用户:admin密码:123456下载链接:thinkphp框架微商分销代理商城源码-代理等级和升级条件…

    2022年5月17日
    49
  • 用App Designer 制作2048小游戏

    用App Designer 制作2048小游戏用 AppDesigner 制作 2048 小游戏用 AppDesigner 制作的 2048 MATLAB 版本是 2020b 记录下创作思路 以免日后忘记 APP 界面设计 APP 界面如下 为了好玩 还加入了游戏进行时播放音乐的功能 下面是游戏结束界面 除了按钮和开关部分 其余都可用标签控件制作 游戏结束界面在制作时将其 Visible 属性设为 Off 确保在主界面上层 当判定游戏结束时再将 Visible 属性修改为 On 即可 app gameOverLabe Visible

    2025年10月29日
    6
  • android触摸屏事件,Android Touch事件分析

    android触摸屏事件,Android Touch事件分析AndroidTouch事件分析本文将分析Touch事件的传递。很多复杂的功能都需要深刻的处理Touch事件,例如侧边栏,例如图标的拖动换位。一,Touch事件的执行轨迹Down—>MoveàUP/Cancel二,Touch事件的分类Touch事件可分为两类:OnTouchEvent和onInterceptTouchEvent。消息传递的两种方式(Z轴方向)前者是正在执行touch事件的…

    2025年8月27日
    8
  • MySQL 游标

    MySQL 游标我们之前写的 sql 语句 虽然可以通过筛选条件来限定返回的记录 但是我们却没有办法在结果集里面 像指针一样 定位每一条记录 向前定位 向后定位 或随意定位到某一条记录 为了解决这个问题 我们可以使用游标 游标可以让我们可以对结果集中的每一条记录进行定位 并对指向的记录中的数据进行操作接下来就让我们来看看具体怎么使用 这里的 select 语句用来返回一个创建游标的结果集 cursor 英文意思是游标 光标简单记忆就是说用一个查询语句来描述游标举例 2 2 打开游标定义好游标后 如果想要使用它 就得

    2025年10月17日
    7
  • @RequestParam注解的基本用法

    @RequestParam注解的基本用法在处理方法入参处使用 RequestParam 可以把请求参数传递给请求方法 value 值即请求参数的参数名 required 该参数是否必须 默认为 true d

    2025年8月8日
    9
  • JDBC预处理对象prepareStatement[通俗易懂]

    JDBC预处理对象prepareStatement[通俗易懂]JDBC预处理对象prepareStatement概述一、SQL注入问题SQL注入:用户输入的内容作为了SQL语句语法的一部分,改变了原有SQL真正的意义。假设有登录案例SQL语句如下:SELECT*FROM用户表WHERENAME=用户输入的用户名ANDPASSWORD=用户输的密码;此时,当用户输入正确的账号与密码后,查询到了信息则让用户登录。但是当用户输入的账…

    2022年6月1日
    39

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号