
create database if not exists bilibili; #创建数据库bilibili
use bilibili; #选择bilibili数据库，即可进行下面的代码演示
drop database if exists bilibili; #代码演示结束后删除bilibili数据库。这个小文件全部代码演示完再删
show databases;  #查看是否删除完成

-- ------------------------------------------MySQL体系结构-----------------------------------------------------

/*可以连接MySQL服务器的客户端
Native C API、JDBC(用于Java连接数据库)、ODBC、.NET、PHP、Perl、Python、Ruby、Cobol

MySQL服务器端的体系结构是分层的
第一层:连接层。接收来自客户端的连接，完成连接的处理以及认证授权的操作，检查是否超过最大连接数
第二层:服务层。核心功能，例如SQL接口、查询解析器、查询优化器、缓存，还有跨存储引擎的实现也是在服务层
第三层:存储引擎层。可在原有引擎的基础上扩展新的引擎，采用的是可插拔存储引擎，用就插不用就拔，负责数据存储和提取
第四层:存储层。控制数据库的数据如何存(包括一系列日志)、如何取、如何组织。具体的数据库中的数据最终是存储在磁盘中的

重点讲一下第三层
存储引擎层的引擎有:InnoDB、MyISAM、NDB、Archive、Federated、Memory、Merge、Partner、Community、Custom、...
存储引擎层的实现有:Memory、Index(也就是索引，不同存储引擎的索引结构不同)、Storage Management
MySQL5.5版本之后默认的存储引擎是InnoDB
MySQL早期的存储引擎是MyISAM
Memory存储引擎的数据是存储在内存中的，通常用来做临时表缓存*/

-- ------------------------------------------存储引擎简介-----------------------------------------------------

/*如何知道我们在之前创建表时的存储引擎
show create table 表名;
上面那行会查询到我们对这张表的建表语句，包括表结构、数据、字符集、排序方式、注释信息。如下
1、ENGINE=InnoDB，即该表的默认存储引擎为InnoDB
2、AUTO_INCREMENT=下一次id ，注意如果没有设置自增的话，就不会有这行关键字
3、DEFAULT CHARSET=utf8mb4，即该表的默认字符集是utf8mb4
4、COLLATE=utf8mb4_0900_ai_ci，即该表的排序方式
5、COMMENT='表的注释'

如何在创建表时指定存储引擎，例如指定表的存储引擎为innodb
create table 表名(
        字段1 字段1类型 [comment 字段1注释],
        ...
        字段n 字段n类型 [comment 字段n注释]
) engine = innodb [comment 表注释];

如何知道在当前MySQL数据库中，到底支持哪些存储引擎，以及各个存储引擎的特点
show engines;
上面那行查询到的是引擎、是否支持、注释、事务、协议、保存点。如下
1、Engine，指的是所有引擎
2、Support，指的是当前MySQL数据库否支持该引擎
3、Comment，指的是引擎的注释
4、Transactions，指的是当前引擎是否支持事务
5、XA，指的是当前引擎是否支持协议
6、Savepoints，指的是当前引擎是否支持保存点*/

-- 1. 创建表 my_myisam，并指定存储引擎为MyISAM
create table my_myisam(
        id int,
        name varchar(10)
) engine = MyISAM;
# 验证:右键右边创建好的my_myisam表，点击Go to DDL，即可查看建表语句，其中可看到engine=MyISAM就说明该表的存储引擎指定成功
# 如果上面那行的验证找不到，就右键右边创建好的my_myisam表，点击Edit Source，效果跟上面那行一样
# 如果实在找不到。则可以双击右边的my_myisam表，点击上面的DDL，即可查看建表语句，效果一样

-- 2. 创建表 my_memory，并指定存储引擎为Memory
create table my_memory(
        id int,
        name varchar(10)
) engine = Memory;

-- 3. 创建表 my_innodb，并指定存储引擎为InnoDB
create table my_innodb(
        id int,
        name varchar(10)
) engine = InnoDB;
# 验证:右键右边创建好的my_memory表，点击Go to DDL，即可查看建表语句，其中可看到engine=Memory就说明该表的存储引擎指定成功
# 如果上面那行的验证找不到，就右键右边创建好的my_memory表，点击Edit Source，效果跟上面那行一样
# 如果实在找不到。则可以双击右边的my_memory表，点击上面的DDL，即可查看建表语句，效果一样


-- ------------------------------------------InnoDB存储引擎-----------------------------------------------------


/*InnoDB存储引擎

介绍
InnoDB是一种兼顾可靠性和高性能的通用存储引擎，在MySQL5.5之后，InnoDB是默认的MySQL存储引擎

特点
1、DML操作遵循ACID模型，支持事务;
DML操作的是数据的更删改;
ACID是数据的四大特性，即原子性、一致性、隔离性、持久性
2、行级锁，提高并发访问性能;
3、支持外键foreign key约束，保证数据的完整性和正确性;

文件
xxx.ibd: xxx代表的是表名，InnoDB引擎的每张表都会对应这样一个表空间文件(xxx.ibd)，存储该表的表结构(frm、sdi)、
数据和索引。

参数:innodb_file_per_table
参数是决定多张表共用一个共享表空间，还是每张个表都对应一个表空间文件
在MySQL8.0版本中，这个开关是打开的，即代表每一张表都对应一个表空间文件

逻辑存储结构
1. TableSpece:表空间。存放例如ibd后缀的文件
在一个表空间中会包含若干个Segment段

2. Segment:段。在一个Segment段中包含若干个Extent区
3. Extent:区。一个区包含若干个Page页。一个Extent区的大小是固定的，为1M。一个区中包含64个页
4. Page:页，有数据页、索引页。一个Page页包含若干个Row行。是磁盘操作的最小单。一个Page页的大小是固定的，为16K

5. Row:行。行就是我们存储在表里面具体的一行行的数据。一个Row行包含如下
(1)Trx id:最后一次操作事务的id
(2)Roll pointer:指针
(3)col1:字段1
(4)col2:字段2
(5)col3:字段3
(6)......*/

#如何查看系统变量。like是模糊匹配的意思
show variables like 'innodb_file_per_table';#查询的结果是ON，即打开状态

#如何打开MySQL的数据存放目录，即ibd后缀的文件，注意该文件找到之后是打不开的，因为该文件是以二进制的形式存储的
# > 此电脑 > 本地磁盘(C:) > ProgramData > MySQL > MySQL Server8.0 > Data > bilibili > 即可看到.ibd后缀的文件

#如何查看ibd后缀的文件，注意只有先创建引擎为InnoDB的表，才能找到这种文件哦
#进入上述路径，找到ibd文件，点击上方路径导航栏，输入cmd，回车，输入: ibd2sdi my_innodb.ibd。回车就会得到json数据
#表示从idb文件中提取sdi表结构数据。上面那行的my_innodb.ibd中的my_innodb是你的表名，即my_innodb替换成你的表名


-- ----------------------------------------------MyISAM存储引擎------------------------------------------------


/*MyISAM存储引擎

介绍
MyISAM是MySQL早期的默认存储引擎

特点
1. 不支持事务，不支持外键
2. 支持表锁，不支持行锁
3. 访问速度快

文件
1. 后缀为MYD:存放表的具体数据
2. 后缀为MYI:存放表的索引
3. 后缀为sdi:存放表结构信息*/

#注意只有先创建引擎为MyISAM的表，才能找到这种文件哦
#如何找到并打开打开上述后缀的文件，注意sdi后缀的文件是可以文本形式打开的，sdi后缀的文件存放的是json格式的数据，
#把这些json数据复制下来，打开浏览器的json.cn网址，即可粘贴格式化，看到我们能看懂的数据
# > 此电脑 > 本地磁盘(C:) > ProgramData > MySQL > MySQL Server8.0 > Data > bilibili > 即可看到上述后缀sdi、MYD、MYI的文件


-- ----------------------------------------------Memory存储引擎------------------------------------------------

/*Memory存储引擎

介绍
Memory引擎的表数据是存储在内存中的，由于受到硬件问题、或断电问题的影响，
只能作为临时表或缓存使用

特点
1. 由于数据存放在内存，所以访问速度快
2. 支持hash索引(默认)

文件
1. xxx.sdi:存储表结构信息*/

#注意只有先创建引擎为Memory的表，才能找到这种文件哦
#如何找到并打开打开上述后缀的文件，注意sdi后缀的文件是可以文本形式打开的，sdi后缀的文件存放的是json格式的数据，
#把这些json数据复制下来，打开浏览器的json.cn网址，即可粘贴格式化，看到我们能看懂的数据
# > 此电脑 > 本地磁盘(C:) > ProgramData > MySQL > MySQL Server8.0 > Data > bilibili > 即可看到上述sdi后缀的文件


-- ------------------------------------区分InnoDB、MyISAM、Memory存储引擎----------------------------------------

/*存储引擎特点

特点                     InnoDB                MyISAM             Memory
存储限制                  64TB                  有                 有
事务安全                  支持                   -                 -
锁机制                    行锁                  表锁               表锁
B+tree索引               支持                   支持               支持
Hash索引                  -                     -                 支持
全文索引                  支持(5.6版本后)         支持               -
空间使用                  高                     低                N/A
内存使用                  高                     低                中等
批量插入速度               低                     高                高
支持外键                  支持                    -                 -   */



/*存储引擎没有好坏之分，只需要在合适的业务场景选择合适的存储引擎
在选择存储引擎时，应该根据应用系统的特点选择合适的存储引擎。对于复杂的应用系统，还可以根据实际情况选择多种存储引擎进行组合

1. InnoDB: 是MySQL的默认存储引擎，支持事务、外键。如果应用对事务的完整性有较高的要求，在并发条件下要求数据的一致性，数据
操作除了插入和查询之外，还包含很多的更新、删除 操作，那么InnoDB存储引擎是比较合适的选择
2. MyISAM: 如果应用是以读操作和插入操作为主，只有很少的更新和删除操作，并且对事务的完整性、并发性要求不是很高，那么选择这
个存储引擎是非常合适的，例如日志数据、足迹数据、评论数据，可以偶尔丢一两条数据。目前被MongoDB代替了
3. MEMORY: 将所有数据保存在内存中，访问速度快，通常用于临时表及存储。MEMORY的缺陷就是对表的大小有限制，太大的表无法缓
存在内存中，而且无法保障数据的安全性。目前被Redis替代了*/

# 下一节课是'MySQL安装(linux版本)'，我搞了3小时，其中MySQL安装包上传至linux，就用了一个小时。我的linux是CentOS9，安装时遇到了很多问题
# 我把解决方法的链接写到下面了，各位记得去试试。别忘了先百度一下怎么关闭linux的防火墙，然后再去搜下面的链接
# 1. 把除最后一个安装包外的其他安装包都强制安装一次，留出最后那个别安装，看一下报错信息，结合如下链接这篇文章即可搞定安装，
# https://www.pudn.com/news/6228c65e9ddf223e1ad05d81.html
# 2. 能启动MySQL之后，输入mysql -u root -p报错，那么请看下面这篇文章来解决
# https://www.bughz.com/forum/content-c44c6ec11f594f25ac8334ca07632853-7c3dba11a37f471697b1cad3434141a4-1-1
# 3. 能mysql -u root -p之后，输入密码那里报错了，原因:MySQL已经为我们创建好了密码，我们需要到日志里面查看正确密码，输入如下命令
# grep 'temporary password' /var/log/mysqld.log
# 4. 登录进去，然后就自定义密码,首先把密码等级改为0，密码长度改为6，如下面两行命令
# set global validate_password.policy = 0;
# set global validate_password.length = 4;
# 5. 再设置密码为123456
# ALTER  USER  'root'@'localhost'  IDENTIFIED BY '123456';
# 6. 创建用户并给与全部权限，用于远程连接，例如我们正在记笔记的软件--datagrip，以后就可以直接用datagrip连接我们linux版MySQL数据库
# create user 'root'@'%' IDENTIFIED WITH mysql_native_password BY '123456';
# grant all on *.* to 'root'@'%';

# 下节课不见不散，这点困难怎么足以让强大的你倒下


