文章发于博主的公众号:Java4y
2021一起好好加油! (ง •_•)ง
内容概览
用MySQL8创建表格时带来的疑惑:1. 为什么int的长度是0?2.COLLATE utf8mb4_0900_ai_ci
又是啥? 3.ROW_FORMAT = Dynamic
?😝
(⊙﹏⊙) 😵 ,没有深入去了解过数据库,今天想着建一个user表用来存放mock出来的数据时才发现,这个知识也太匮乏了吧。。接下来要好好学习下了🐖
创建用户表的sql如下:
DROP TABLE IF EXISTS `test_user`;
CREATE TABLE `test_user` (
`id` int(0) NOT NULL AUTO_INCREMENT,
`user_id` varchar(36) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '用户ID',
`user_name` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '用户名称',
`phone` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '手机号码',
`email` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '邮箱',
`ip` varbinary(4) NOT NULL COMMENT 'IP',
`create_time` datetime(0) NOT NULL COMMENT '创建时间',
`update_time` datetime(0) NOT NULL COMMENT '更新时间',
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;
问题
- 为什么int的长度是0?
COLLATE utf8mb4_0900_ai_ci
又是啥?ROW_FORMAT = Dynamic
?
第一个问题答案🐖
可以看下这个老哥的博客:https://blog.csdn.net/shunshengli/article/details/106473613
文中说到:
根据官网资料可知:从8.0.17版本开始,TINYINT, SMALLINT, MEDIUMINT, INT, and BIGINT类型的显示宽度将失效。
我们来到官网看一下:官网文档路径
点击下图红框👈
在搜索框中输入 width
,然后点击进入这个搜索项Numeric Data Type Syntax
(数值数据类型语法),可以看到下图😁
As of MySQL 8.0.17, the display width attribute is deprecated for integer data types; you should expect support for it to be removed in a future version of MySQL.
可以看到这里也在说 在MySQL 8.0.17中,display width属性不适用于整数数据类型;在MySQL的未来版本中,应该会删除对它的支持。
查看下MySQL的版本 select version() from dual;
好吧╮(╯-╰)╭,这个技术变化也忒快了吧! 我还在纠结这些栏位要多少个长度好,特别是上面这个IP
字段,还特意去看下这个《高性能MySQL》这本书:如图说到,此时还不知道有这个VARBINARY
字段🐖
无符号整数就想到了int UNSIGNED
解决🐖
后面突然发现这个int
用来存IPv4的,额 那IPv6咋搞。。 😵(((φ(◎ロ◎;)φ)))。
哈哈哈 先聊个题外话—回头查查上次各大媒体都在说的IPv4用完是什么日子来着,原来已经快一年了🐖 11.26
回到正题 哈哈 来到上面那个官方文档,搜索ipv4
来到这个文章《Miscellaneous Functions》
可以看到下图,这里说IPv6
的地址范围太大了,要设置成VARBINARY(16)
,IPv4
设置成VARBINARY(4)
,这个VARBINARY是大的二进制数据类型。
同时可以看到文档里提供了很多函数来转换👈
建个表试试 如下
第二个问题答案🐖
直接在官网中百度,来到下面这个文章
这里有个有意思的点,就是MySQL
中的utf8
并不是真正的utf8
,听挺多人踩坑了之前,哈哈 没想到utf8mb4
才是真正的utf8
😄
这里COLLATE = utf8mb4_0900_ai_ci
是说校验那个Unicode排序算法
,如下图😄
简单了解。。赶紧撤 😆
第三个问题答案🐖
还是一样在官网文档中搜索这个问题,如下:
这里表示使用动态存储格式
The InnoDB storage engine supports four row formats: REDUNDANT, COMPACT, DYNAMIC, and COMPRESSED.
使用这种格式的优点:
额外的笔记
外键约束
-- 关闭外键约束
SET FOREIGN_KEY_CHECKS = 0;
-- 启动外键约束
SET FOREIGN_KEY_CHECKS = 1;
InnoDB Row Formats
摘抄官网文档,地址如下 InnoDB Row Formats
The row format of a table determines how its rows are physically stored, which in turn can affect the performance of queries and DML operations. As more rows fit into a single disk page, queries and index lookups can work faster, less cache memory is required in the buffer pool, and less I/O is required to write out updated values.
The data in each table is divided into pages. The pages that make up each table are arranged in a tree data structure called a B-tree index. Table data and secondary indexes both use this type of structure. The B-tree index that represents an entire table is known as the clustered index, which is organized according to the primary key columns. The nodes of a clustered index data structure contain the values of all columns in the row. The nodes of a secondary index structure contain the values of index columns and primary key columns.
我的理解:
innodb
使用page
去存储数据,每个page都是由多个row构成的,page中存储的数据越多,索引起来就更快。而要想多存储一些数据,这个row的存储格式–Row format
就很重要了,它决定了这个row怎么存储,占用的资源的多少,进一步影响到这个索引的性能。
聚簇索引是 对应行的主键+那一行所有列的值,
而非聚簇索引 就只有某些列的值,还有对应的主键列的值。
一般建立的那些索引 都是通过找到对应主键列的值,然后找到聚簇索引中对应的主键列,获取资料的。
再重复下这个 InnoDB
支持的 row formats
The InnoDB storage engine supports four row formats: REDUNDANT, COMPACT, DYNAMIC, and COMPRESSED.
结论
要学会看文档 哈哈哈😄😝
Mysql8官方文档