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