面试题答案
一键面试MySQL中日期和时间类型底层存储原理
- DATE:以
YYYY-MM-DD
格式存储日期,占用3个字节。其存储的是从0001-01-01
到9999-12-31
之间的日期值,内部存储的是天数,从0001-01-01
开始计算。 - TIME:以
HH:MM:SS
格式存储时间,占用3个字节。其存储的是时间值,范围是'-838:59:59'
到'838:59:59'
,内部存储的是从午夜开始的秒数,可正可负。 - DATETIME:以
YYYY-MM-DD HH:MM:SS
格式存储日期和时间,占用8个字节。范围是'1000-01-01 00:00:00'
到'9999-12-31 23:59:59'
,存储的是从'1970-01-01 00:00:00'
开始的秒数。 - TIMESTAMP:占用4个字节,范围是
'1970-01-01 00:00:01' UTC
到'2038-01-19 03:14:07' UTC
。它存储的是从1970-01-01 00:00:00 UTC
开始的秒数,会根据服务器时区进行转换。
高并发写入且毫秒级精度场景下的设计
- 数据库表结构设计
- 日期时间字段:使用
BIGINT
类型来存储时间戳,精确到毫秒。因为BIGINT
可以存储8字节的数据,能够满足大范围时间值存储需求。例如,可以存储从1970年1月1日00:00:00 UTC开始的毫秒数。 - 其他字段:根据业务需求设计其他字段,确保每个字段的数据类型选择合理,避免不必要的空间浪费。
- 日期时间字段:使用
- 日期时间类型选择
- 不使用原生日期时间类型:由于MySQL原生的
DATE
、TIME
、DATETIME
和TIMESTAMP
类型最高精度只能到秒,无法满足毫秒级精度需求,所以选择使用BIGINT
存储时间戳。
- 不使用原生日期时间类型:由于MySQL原生的
- 相关配置和优化手段
- 数据库配置
- innodb_buffer_pool_size:增大该参数值,让更多的数据可以缓存到内存中,减少磁盘I/O操作,提高写入性能。例如,可以根据服务器内存大小设置为物理内存的60% - 80%。
- innodb_log_file_size:适当增大该参数,减少日志切换频率,提高写入效率。但需注意,过大可能会增加恢复时间。
- 索引优化
- 创建索引:对于包含时间戳字段的查询条件,创建合适的索引。例如,如果经常按照时间范围查询,可以创建单字段索引或联合索引,以加速查询。
- 写入优化
- 批量写入:采用批量插入语句,减少数据库交互次数,提高写入效率。例如,一次插入多条数据,而不是多次执行单条插入语句。
- 事务处理:合理使用事务,将多个相关的写入操作放在一个事务中,确保数据一致性的同时,减少锁的持有时间,降低并发冲突。
- 数据库配置