MySQL进阶
01、MySQL进阶:剖析MySQL索引底层数据结构
02、MySQL进阶:MySQL不同存储引擎下索引的实现
03、MySQL进阶:Explain深度剖析
04、MySQL进阶:践行索引优化
05、MySQL进阶:锁等待及死锁初探
06、MySQL进阶:无索引行锁升级为表锁
07、MySQL进阶:共享锁和排它锁初探
08、MySQL进阶:索引优化案例实操
09、MySQL进阶:索引下推IndexConditionPushdown初探
10、MySQL进阶:使用trace工具来窥探MySQL是如何选择执行计划的
11、MySQL进阶:orderby和groupby优化初探
12、MySQL进阶:分页查询优化的两个案例解析
13、MySQL进阶:Join关联查询优化
14、MySQL进阶:In和Exists的优化案例讲解
15、MySQL进阶:存储引擎初探
16、MySQL进阶:体系结构初探
17、MySQL进阶:解读MySQL事务与锁机制
18、MySQL进阶:多版本控制MVCC机制初探
19、MySQL进阶:并发事务问题及解决方案
20、MySQL进阶:锁机制初探
21、MySQL进阶:高效的设计MySQL库表
22、MySQL进阶:库表设计之IP和TIMESTAMP的处理
23、MySQL进阶:orderby出现usingfilesort根因分析及优化
24、MySQL进阶:canal实现mysql数据同步到redis|实现自定义canal客户端
本文档使用 MrDoc 发布
-
+
首页
22、MySQL进阶:库表设计之IP和TIMESTAMP的处理
 ------------ ### TIMESTAMP 我们使用 MySQL 内置的函数(FROM_UNIXTIME(),UNIX_TIMESTAMP()),可以将日期转化为数字,用 INT UNSIGNED 存储日期和时间 示例 时间2020-08-17 22:22:22 与整数之间的转换,**转化后数字是连续的,占用空间更小,并且可以使用索引提升查询性能。** ```python mysql> select UNIX_TIMESTAMP('2020-08-17 22:22:22'); +---------------------------------------+ | UNIX_TIMESTAMP('2020-08-17 22:22:22') | +---------------------------------------+ | 1597674142 | +---------------------------------------+ 1 row in set mysql> select FROM_UNIXTIME(1597674142); +---------------------------+ | FROM_UNIXTIME(1597674142) | +---------------------------+ | 2020-08-17 22:22:22 | +---------------------------+ 1 row in set mysql> ``` ```python mysql> select UNIX_TIMESTAMP(now()); +-----------------------+ | UNIX_TIMESTAMP(now()) | +-----------------------+ | 1597674191 | +-----------------------+ 1 row in set mysql> select FROM_UNIXTIME(1597674191); +---------------------------+ | FROM_UNIXTIME(1597674191) | +---------------------------+ | 2020-08-17 22:23:11 | +---------------------------+ 1 row in set mysql> ```  ------------ ### IP - 一般使用 Char(15) 进行存储,但是当进行查找和统计时,字符类型不是很高效。 - MySQL 数据库内置了两个 IP 相关的函数 INET_ATON()、INET_NTOA(),可以实现 IP 地址和整数的项目转换。 因此,我们使用 INT UNSIGNED(占用 4 个字节)存储 IP,非 Char(15)。占 15 个字节。 ```python mysql> select INET_ATON('127.0.0.1'); +------------------------+ | INET_ATON('127.0.0.1') | +------------------------+ | 2130706433 | +------------------------+ 1 row in set mysql> select INET_NTOA(2130706433); +-----------------------+ | INET_NTOA(2130706433) | +-----------------------+ | 127.0.0.1 | +-----------------------+ 1 row in set mysql> ``` **将IP 的存储从字符型转换成整形,转化后数字是连续的,提高了查询性能,使查询更快,占用空间更小。**  ------------ ### 总结 1、 以高性能为目标,库表设计以范式为主,根据特殊业务场景使用反范式,允许必要的空间换时间; 2、 规范数据库的使用原则,统一规范命名,减少性能隐患,减少隐式转换; 3、 高性能表设计的原则:合适的字段、合适的长度、NOTNULL; 4、 从不同角度思考IP、timestamp的转换,拓宽设计思路; 5、 规范的命名可提高可读性,反范式设计可提高查询性能;
李智
2025年3月17日 13:32
转发文档
收藏文档
上一篇
下一篇
手机扫码
复制链接
手机扫一扫转发分享
复制链接
Markdown文件
分享
链接
类型
密码
更新密码