我学MySQL8的小疑问|周末学习

本文已参与 周末学习计划,点击查看详情

这是我参与更文挑战的第5天,活动详情查看: 更文挑战

内容概览

用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;


复制代码

问题

  1. 为什么int的长度是0?

  2. COLLATE utf8mb4_0900_ai_ci又是啥?

  3. ROW_FORMAT = Dynamic

第一个问题答案?

可以看下这个老哥的博客:blog.csdn.net/shunshengli…

文中说到:

根据官网资料可知:从8.0.17版本开始,TINYINT, SMALLINT, MEDIUMINT, INT, and BIGINT类型的显示宽度将失效。

我们来到官网看一下:官网文档路径dev.mysql.com/doc/

点击下图红框?

20201022075037

在搜索框中输入 width,然后点击进入这个搜索项Numeric Data Type Syntax(数值数据类型语法),可以看到下图?

20201022075829

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;

20201021222045

好吧╮(╯-╰)╭,这个技术变化也忒快了吧! 我还在纠结这些栏位要多少个长度好,特别是上面这个IP字段,还特意去看下这个《高性能MySQL》这本书:如图说到,此时还不知道有这个VARBINARY字段?

20201022080713

无符号整数就想到了int UNSIGNED解决?

后面突然发现这个int用来存IPv4的,额 那IPv6咋搞。。 ?(((φ(◎ロ◎;)φ)))。

哈哈哈 先聊个题外话—回头查查上次各大媒体都在说的IPv4用完是什么日子来着,原来已经快一年了? 11.26

20201022082110

回到正题 哈哈 来到上面那个官方文档,搜索ipv4 来到这个文章《Miscellaneous Functions》 : dev.mysql.com/doc/refman/…

可以看到下图,这里说IPv6的地址范围太大了,要设置成VARBINARY(16),IPv4设置成VARBINARY(4),这个VARBINARY是大的二进制数据类型。

20201022230847

同时可以看到文档里提供了很多函数来转换?

20201022231912

建个表试试 如下

20201023073122

第二个问题答案?

直接在官网中百度,来到下面这个文章

20201022233253

这里有个有意思的点,就是MySQL中的utf8并不是真正的utf8,听挺多人踩坑了之前,哈哈 没想到utf8mb4才是真正的utf8?

这里COLLATE = utf8mb4_0900_ai_ci是说校验那个Unicode排序算法,如下图?

20201022234120

简单了解。。赶紧撤 ?

第三个问题答案?

还是一样在官网文档中搜索这个问题,如下:

20201022234639

这里表示使用动态存储格式

The InnoDB storage engine supports four row formats: REDUNDANT, COMPACT, DYNAMIC, and COMPRESSED.

使用这种格式的优点:

20201023000807

额外的笔记

外键约束

-- 关闭外键约束

SET FOREIGN_KEY_CHECKS = 0;

-- 启动外键约束

SET FOREIGN_KEY_CHECKS = 1;
复制代码

InnoDB Row Formats

摘抄官网文档,地址如下 InnoDB Row Formatsdev.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 冲冲冲!!

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享