MySQL库表设计的技巧有哪些
MySQL库表设计的技巧有哪些,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。
1.int类型的选用整型字段类型包含 tinyint
、smallint
、mediumint
、int
、bigint
五种,占用空间大小及存储范围如下图所示:
存储字节越小,占用空间越小。所以本着最小化存储的原则,我们要尽量选择合适的整型,下面给出几个常见案例及选择建议。
根据存储范围选择合适的类型,比如人的年龄用 unsigned tinyint(范围 0~255,人的寿命不会超过 255 岁);海龟就必须是smallint,但如果是太阳的年龄,就必须是int。
若存储的数据为非负数值,建议使用 UNSIGNED 标识,可以扩大正数的存储范围。
短数据使用 TINYINT 或 SMALLINT,比如:人类年龄,城市代码。
存储状态变量的字段用 TINYINT ,比如:是否删除,0代表未删除 1代表已删除。
主键列,无负数,建议使用 INT UNSIGNED 或者 BIGINT UNSIGNED;预估字段数字取值会超过 42 亿,使用 BIGINT 类型。
下面给出建表语句示范:
CREATETABLE`tb_int`(`increment_id`intunsignedNOTNULLAUTO_INCREMENTCOMMENT'自增主键',`stu_age`tinyintunsignedNOTNULLCOMMENT'学生年龄',`is_deleted`tinyintunsignedDEFAULT'0'COMMENT'0:未删除1:删除',`col1`bigintNOTNULLCOMMENT'bigint字段',PRIMARYKEY(`increment_id`))ENGINE=InnoDBDEFAULTCHARSET=utf8COMMENT='int测试表';2.时间类型的选用
时间字段类型可以选用datetime和timestamp,下面用一张表展示下二者的区别:
timestamp翻译为汉语即”时间戳”,它是当前时间到 Unix元年(1970 年 1 月 1 日 0 时 0 分 0 秒)的秒数,占用4个字节,而且是以UTC的格式储存,它会自动检索当前时区并进行转换。datetime以8个字节储存,不会进行时区的检索。也就是说,对于timestamp来说,如果储存时的时区和检索时的时区不一样,那么拿出来的数据也不一样。对于datetime来说,存什么拿到的就是什么。下面给出几个常见案例及选择建议。
根据存储范围来选取,比如生产时间,保质期等时间建议选取datetime,因为datetime能存储的范围更广。
记录本行数据的插入时间和修改时间建议使用timestamp。
和时区相关的时间字段选用timestamp。
如果只是想表示年、日期、时间的还可以使用 year、 date、 time,它们分别占据 1、3、3 字节,而datetime就是它们的集合。
如果timestamp字段经常用于查询,我们还可以使用MySQL内置的函数FROM_UNIXTIME()
、UNIX_TIMESTAMP()
,将日期和时间戳数字来回转换,转换后可以用 INT UNSIGNED 存储时间,数字是连续的,占用空间更小,并且可以使用索引提升查询性能。下面给出示范建表语句及时间戳相关转换SQL:
CREATETABLE`tb_time`(`increment_id`intunsignedNOTNULLAUTO_INCREMENTCOMMENT'自增主键',`col1`datetimeNOTNULLDEFAULT'2020-10-0100:00:00'COMMENT'到期时间',`unix_createtime`intunsignedNOTNULLCOMMENT'创建时间戳',`create_time`timestampNOTNULLDEFAULTCURRENT_TIMESTAMPCOMMENT'创建时间',`update_time`timestampNOTNULLDEFAULTCURRENT_TIMESTAMPONUPDATECURRENT_TIMESTAMPCOMMENT'修改时间',PRIMARYKEY(`increment_id`),KEY`idx_unix_createtime`(`unix_createtime`))ENGINE=InnoDBDEFAULTCHARSET=utf8COMMENT='time测试表';#插入数据insertintotb_time(unix_createtime,create_time)values(UNIX_TIMESTAMP(now()),now());#时间戳数字与时间相互转换selectUNIX_TIMESTAMP('2020-05-0600:00:00')selectFROM_UNIXTIME(1588694400)3.存储IP值
IP值一般使用char或varchar进行存储,但是当进行查找和统计时,字符类型不是很高效。MySQL数据库内置了两个IP相关的函数INET_ATON()
、INET_NTOA()
,可以实现 IP 地址和整数类型的转换。转换后使用可以INT UNSIGNED 来存储IP,转换后的数字是连续的,提高了查询性能,占用空间更小。
CREATETABLE`tb_ip`(`increment_id`int(10)unsignedNOTNULLAUTO_INCREMENTCOMMENT'自增主键',`name`varchar(100)NOTNULLCOMMENT'姓名',`inet_ip`int(10)unsignedNOTNULLCOMMENT'IP',PRIMARYKEY(`increment_id`),KEY`idx_inet_ip`(`inet_ip`))ENGINE=InnoDBDEFAULTCHARSET=utf8COMMENT='ip测试表';#插入数据insertinto`tb_ip`(`name`,`inet_ip`)values('wang',INET_ATON('192.168.0.1')),('lisi',INET_ATON('192.168.0.2'));#相互转换selectINET_ATON('192.168.0.1');selectINET_NTOA(3232235521);
看完上述内容,你们掌握MySQL库表设计的技巧有哪些的方法了吗?如果还想学到更多技能或想了解更多相关内容,欢迎关注亿速云行业资讯频道,感谢各位的阅读!
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。