做网站上传图片多大合适邢台列表网

当前位置: 首页 > news >正文

做网站上传图片多大合适,邢台列表网,免费加客源软件,揭阳装修网站建设在MySQL数据库中#xff0c;除了前面我们聊到的数字类型和字符串类型#xff0c;还有一个常用的数据类型#xff1a;日期类型。在我们业务表中#xff0c;基本上每个业务表都有日期类型#xff0c;用于记录创建时间和修改时间。比如我们的用户表#xff0c;一般除了要记录… 在MySQL数据库中除了前面我们聊到的数字类型和字符串类型还有一个常用的数据类型日期类型。在我们业务表中基本上每个业务表都有日期类型用于记录创建时间和修改时间。比如我们的用户表一般除了要记录用户的注册时间还要记录最后登录时间。 日期类型虽然常见但在表结构设计中也容易犯错比如很多技术都倾向使用整型存储日期类型同时也会忽略不同日期类型对于性能可能存在的潜在影响。 一、MySQL中有哪些日期类型 MySQL 数据库中常见的日期类型有 YEAR、DATE、TIME、DATETIME、TIMESTAMEP。因为业务绝大部分场景都需要将日期精确到秒所以在表结构设计中常见使用的日期类型为DATETIME 和 TIMESTAMP。下面我们来了解一下DATETIME和TIMESTAMP。 1、DATETIME 类型 DATETIME 最终展现的形式为YYYY-MM-DD HHMMSS固定占用 8 个字节。 从 MySQL 5.6 版本开始DATETIME 类型支持毫秒DATETIME(N) 中的 N 表示毫秒的精度。例如DATETIME(6) 表示可以存储 6 位的毫秒值。同时一些日期函数也支持精确到毫秒例如常见的函数 NOW、SYSDATE mysql SELECT NOW(6);—————————-| NOW(6)                     |—————————-| 2024-05-11 17:50:28.707971 |—————————-1 row in set (0.00 sec) 用户可以将 DATETIME 初始化值设置为当前时间并设置自动更新当前时间的属性。例如之前已设计的用户表 User在其基础上修改register_date、last_modify_date的定义 CREATE TABLE User (    id BIGINT NOT NULL AUTO_INCREMENT,    name VARCHAR(255) NOT NULL,    sex CHAR(1) NOT NULL,    password VARCHAR(1024) NOT NULL,    money INT NOT NULL DEFAULT 0,    register_date DATETIME(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6),    last_modify_date DATETIME(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6) ON UPDATE CURRENT_TIMESTAMP(6),    CHECK (sex  M OR sex  F),    PRIMARY KEY(id)); 在上面的表 User 中列 register_date 表示注册时间DEFAULT CURRENT_TIMESTAMP 表示记录插入时若没有指定时间默认就是当前时间。 列 last_modify_date 表示当前记录最后的修改时间DEFAULT CURRENT_TIMESTAMP(6) ON UPDATE CURRENT_TIMESTAMP(6) 表示每次修改都会修改为当前时间。 这样的设计保证当用户的余额money 字段发生了变更则 last_modify_date 能记录最后一次用户金钱发生变更时的时间。 mysql SELECT name,money,last_modify_date FROM User WHERE name  David;——————————————| name  | money | last_modify_date           |——————————————| David |   100 | 2024-05-11 08:08:33.898593 |——————————————1 row in set (0.00 sec)mysql UPDATE User SET money  money - 1 WHERE name  David;Query OK, 1 row affected (0.06 sec)Rows matched: 1  Changed: 1  Warnings: 0mysql SELECT name,money,last_modify_date FROM User WHERE name  David;——————————————| name  | money | last_modify_date           |——————————————| David |    99 | 2024-05-11 18:29:17.056327 |——————————————1 row in set (0.00 sec) 可以看到当用户金额发生修改时所对应的字段 last_modify_date 也修改成发生变更的时间。 2、TIMESTAMP 除了 DATETIME日期类型中还有一种 TIMESTAMP 的时间戳类型其实际存储的内容为‘1970-01-01 00:00:00’到现在的毫秒数。在 MySQL 中由于类型 TIMESTAMP 占用 4 个字节因此其存储的时间上限只能到‘2038-01-19 03:14:07’。 同类型 DATETIME 一样从 MySQL 5.6 版本开始类型 TIMESTAMP 也能支持毫秒。与 DATETIME 不同的是若带有毫秒时类型 TIMESTAMP 占用 7 个字节而 DATETIME 无论是否存储毫秒信息都占用 8 个字节。 类型 TIMESTAMP 最大的优点是可以带有时区属性因为它本质上是从毫秒转化而来。如果业务需要对应不同的国家时区那么类型 TIMESTAMP 是一种不错的选择。比如新闻类的业务通常用户想知道这篇新闻发布时对应的自己国家时间那么 TIMESTAMP 是一种选择。 另外有些国家会执行夏令时。根据不同的季节人为地调快或调慢 1 个小时带有时区属性的 TIMESTAMP 类型本身就能解决这个问题。 参数 time_zone 指定了当前使用的时区默认为 SYSTEM 使用操作系统时区用户可以通过该参数指定所需要的时区。 二、表结构设计实践 1、DATETIME、TIMESTAMP和INT应该用哪个 在做表结构设计时对日期字段的存储开发人员通常会有 3 种选择DATETIME、TIMESTAMP、INT。 INT 类型就是直接存储 1970-01-01 00:00:00 到现在的毫秒数本质和 TIMESTAMP 一样因此用 INT 不如直接使用 TIMESTAMP。 当然有人会认为 INT 比 TIMESTAMP 性能更好。但是由于当前每个 CPU 每秒可执行上亿次的计算所以无须为这种转换的性能担心。更重要的是在后期运维和数据分析时使用 INT 存储日期是会让 DBA 和数据分析人员发疯的INT的可运维性太差。 也有的技术会热衷用类型 TIMESTEMP 存储日期因为类型 TIMESTAMP 占用 4 个字节比 DATETIME 小一半的存储空间。 但若要将时间精确到毫秒TIMESTAMP 要 7 个字节和 DATETIME 8 字节差不太多。另一方面现在距离 TIMESTAMP 的最大值‘2038-01-19 03:14:07’已经很近这方面还需要大家好好考虑一下。 总的来说建议你使用类型 DATETIME。 对于时区问题可以由前端或者服务这里做一次转化不一定非要在数据库中解决。 2、TIMESTAMP的性能问题 TIMESTAMP 的上限值 2038 年很快就会到来那时业务又将面临一次类似千年虫的问题。另外TIMESTAMP 还存在潜在的性能问题。 虽然从毫秒数转换到类型 TIMESTAMP 本身需要的 CPU 指令并不多这并不会带来直接的性能问题。但是如果使用默认的操作系统时区则每次通过时区计算时间时要调用操作系统底层系统函数 __tz_convert()而这个函数需要额外的加锁操作以确保这时操作系统时区没有修改。所以当大规模并发访问时由于热点资源竞争会产生两个问题。 性能不如 DATETIME DATETIME 不存在时区转化问题。 性能抖动 海量并发时存在性能抖动问题。 这里针对时区问题我们应该使用显式时区而不是使用操作系统的时区可以在配置文件中显式的设置时区。比如在my.conf中设置 [mysqld]time_zone  08:00 三、表设计建议 在做表结构设计规范时建议每张业务核心表都增加一个 DATETIME 类型的 last_modify_date 字段并设置修改自动更新机制 即便标识每条记录最后修改的时间。 这样设计的好处是 用户可以知道每个用户最近一次记录更新的时间以便做后续的处理。比如在电商的订单表中可以方便对支付超时的订单做处理在金融业务中可以根据用户资金最后的修改时间做相应的资金核对等。 文章将持续更新欢迎关注公众号服务端技术精选。欢迎点赞、关注、转发。