create database if not exists bilibili; #创建数据库bilibili use bilibili; #选择bilibili数据库,即可进行下面的代码演示 drop database if exists bilibili; #代码演示结束后删除bilibili数据库。这个小文件全部代码演示完再删 show databases; #查看是否删除完成
可以连接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是一种兼顾可靠性和高性能的通用存储引擎,在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是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引擎的表数据是存储在内存中的,由于受到硬件问题、或断电问题的影响, 只能作为临时表或缓存使用
特点
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 |
---|---|---|---|
存储限制 | 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报错,那么请看下面这篇文章来解决
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'@'%';
下节课不见不散,这点困难怎么足以让强大的你倒下