本文已参与 周末学习计划,点击查看详情
这是我参与更文挑战的第5天,活动详情查看: 更文挑战
内容概览
用MySQL8创建表格时带来的疑惑:
- 为什么int的长度是0 ?
COLLATE utf8mb4_0900_ai_ci
又是啥?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
?
第一个问题答案?
可以看下这个老哥的博客:blog.csdn.net/shunshengli…
文中说到:
根据官网资料可知:从8.0.17版本开始,TINYINT, SMALLINT, MEDIUMINT, INT, and BIGINT类型的显示宽度将失效。
我们来到官网看一下:官网文档路径 : dev.mysql.com/doc/
点击下图红框?
在搜索框中输入 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》 : dev.mysql.com/doc/refman/…
可以看到下图,这里说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 : dev.mysql.com/doc/refman/…
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
he InnoDB storage engine supports four row formats: REDUNDANT, COMPACT, DYNAMIC, and COMPRESSED.
结论
要学会看文档 哈哈哈??
Mysql8官方文档 : dev.mysql.com/doc/
欢迎关注,交个朋友呀!! ( •̀ ω •́ )y
嘿嘿,我是4ye 咱们下期…… 很快再见!?
如果你觉得本篇文章对你有所帮助的话,那拜托再点点赞支持一下呀?
让我们开始这一场意外的相遇吧!~
欢迎留言!谢谢支持!ヾ(≧▽≦*)o 冲冲冲!!