我学Mysql8的那点事~

文章发于博主的公众号:Java4y

2021一起好好加油! (ง •_•)ง
内容概览
用MySQL8创建表格时带来的疑惑:1. 为什么int的长度是0?2. COLLATE utf8mb4_0900_ai_ci又是啥? 3. ROW_FORMAT = Dynamic?😝
wechat

(⊙﹏⊙) 😵 ,没有深入去了解过数据库,今天想着建一个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

第一个问题答案🐖

可以看下这个老哥的博客:https://blog.csdn.net/shunshengli/article/details/106473613
文中说到:

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

我们来到官网看一下:官网文档路径
点击下图红框👈
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

可以看到下图,这里说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 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官方文档

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值