MySQL(持续更新)

一、SQL通用语法

1.SQL语句可以单行或多行书写,以分号结尾
2.SQL语句可以使用空格/缩进来增强语句得可读性
3.Mysql数据库的SQL语句不区分大小写,关键字建议使用大写
4.注释

单行注释:--注释内容或#注释内容(Mysql特有)
多行注释:/*注释内容*/

二、SQL分类

在这里插入图片描述

definition 带非您神
manipulation 莫您泼雷神
query 块儿瑞

三、DDL数据库操作

#查询所有数据库
show databases;
#查询当前数据库
select database();
#创建数据库
create database [if not exists] 数据库名
[default charset 字符集] [collate 排序规则]; 
#utf8字符集存储长度3个字节,中文字符编码长度一般为3字节
#有些特殊字符占四个字节,所以建议使用utf8mb4编码
#删除数据库
drop database [if exists] 数据库名;
#使用数据库
use 数据库名;

四、DDL表操作

1.查询

#查询当前数据库所有表
show tables;
#查询表结构
desc 表名;
#查询指定表的建表语句
show create table 表明;

2.创建

create table 表名(
    字段1 字段1类型[comment 字段1注释],
    字段2 字段2类型[comment 字段2注释],
    字段3 字段3类型[comment 字段3注释],
    ...
    字段n 字段n类型[comment 字段n注释]
)[comment 表注释];
[]里可省略,最后一个字段后面没有逗号

数据类型

1.数值类型

在这里插入图片描述

2.字符串类型

在这里插入图片描述

3.日期类型

在这里插入图片描述

3.修改

1.添加字段
alter table 表名 add 字段名 类型(长度)[comment 注释][约束];
2.修改字段
#修改数据类型
alter table 表名 modify 字段名 新数据类型(长度);
#修改字段名和字段类型
alter table 表名 change 旧字段名 新字段名 类型(长度) [comment 注释][约束];
3.删除字段
alter table 表名 drop 字段名;
4.修改表名
alter table 表名 rename to 新表名;
5.删除表
#   删除表
drop table [if exists]表名;
#删除指定表的数据
truncate table 表名;

五、DML数据操作

1.添加数据

#给指定字段添加数据
insert into 表名 (字段名1,字段名2,...) values(1,2,...);
#给全部字段添加数据
insert into 表名 (1,2,...);
#批量添加数据
insert into 表名 (字段名1,字段名2,...) values (1,2,..),(1,2,..);
insert into 表名 (1,2,..),(1,2,..);

注意事项:
①插入数据时,指定的字段顺序需要与值得顺序是一一对应的
②字符串和日期型数据应该包含在引号中
③插入的数据大小,应该在字段的规定范围内

2.修改数据

update 表名 set 字段名1 =1,字段名2 =2,...[where 条件];

注意事项:
修改语句的条件可以有,也可以没有,如果没有,则会修改整张表的所有数据

3.删除数据

delete from 表名 [where 条件];

注意事项:
删除语句的条件可以有,也可以没有,如果没有,则会删除整张表的所有数据
删除语句不能删除某一个字段的值(可以使用update)

六、DQL数据查询

1.基本查询

#查询多个字段
select 字段1,字段2, ... from 表名;
#查询全部字段
select * from 表名;
#设置别名
select 字段名 [as 别名1],字段2[as 别名2]... from 表名;
#去除重复记录
select distinct 字段列表 from 表名;

2.条件查询

select 字段列表 from 表名 where 条件列表;
1.算数运算符

在这里插入图片描述

2.赋值运算符[=]
3.比较运算符

在这里插入图片描述

①NULL值处理
  • IS NULL: 当列的值是 NULL,此运算符返回 true。
  • IS NOT NULL: 当列的值不为 NULL, 运算符返回 true。
  • <=>: 比较操作符(不同于 = 运算符),当比较的的两个值相等或者都为 NULL 时返回 true。
  • NULL 值与任何其它值的比较(即使是 NULL)永远返回 NULL,即 NULL = NULL 返回 NULL
#columnName1,columnName2 为 int 型,
#当 columnName2 中,有值为 null 时,
#columnName1+columnName2=null, 
#ifnull(columnName2,0) 把 columnName2 中 null 值转为 0。
select * , columnName1+ifnull(columnName2,0) from tableName;
②LIKE模糊查询

只与字符型数据联合使用
在这里插入图片描述

#在表中查询姓名是张某的信息
select * from 表名 where name like '张_';
#在表中查询姓名是 以张开头的 的信息
select * from 表名 where name like '张%';
#在表中查询姓名是 包括张 的信息
select * from 表名 where name like '%张%';
#在表中查询姓名是 以张结尾的 的信息
select * from 表名 where name like %张';
③REGEXP正则表达式

MySQL 同样也支持其他正则表达式的匹配, MySQL中使用 REGEXP 操作符来进行正则表达式匹配
在这里插入图片描述

#查找name字段中以'st'为开头的所有数据
SELECT name FROM person_tbl WHERE name REGEXP '^st';
#查找name字段中以'ok'为结尾的所有数据
SELECT name FROM person_tbl WHERE name REGEXP 'ok$';
#查找name字段中包含'mar'字符串的所有数据
SELECT name FROM person_tbl WHERE name REGEXP 'mar';
#查找name字段中以元音字符开头或以'ok'字符串结尾的所有数据
SELECT name FROM person_tbl WHERE name REGEXP '^[aeiou]|ok$';
④BETWEEN两者之间

MySQL中的"BETWEEN"是一个条件操作符,用于在查询中指定一个范围

select * from 表名 wherebetween 60 and 80;
相当于
 select * from 表名 where>=60 and<=80;
 如果select * from 表名 wherebetween 80 and 60;是查不出来的
⑤IN在集合中

MySQL中的"IN"是一种条件操作符,用于在查询中指定一个值的范围。它允许您在单个查询中匹配多个值

select * from 表名 wherein(1,2,3);
相当于
select * from 表名 where=1 or=2 or=3;
4.逻辑运算符

在这里插入图片描述

XOR异或

在MySQL中,逻辑运算符 XOR 表示“异或”操作。它用于将两个布尔表达式进行比较,如果其中一个表达式为真而另一个为假,则返回真。如果两个表达式都为真或都为假,则返回假。
以下是使用 XOR 运算符进行逻辑运算的示例:

SELECT column1, column2
FROM table
WHERE expression1 XOR expression2;

在上面的示例中,expression1 和 expression2 是两个布尔表达式。如果 expression1 为真而 expression2 为假,或者 expression1 为假而 expression2 为真,则查询结果将被返回。如果两个表达式都为真或都为假,则查询结果将被过滤掉。
XOR 运算符在MySQL中不同于其他编程语言中的逻辑异或运算符(如 ^)。在MySQL中,XOR 运算符只接受两个表达式作为参数,而不是对整个结果集应用异或运算。

5.位运算符

位运算符是在二进制数上进行计算的运算符。位运算会先将操作数变成二进制数,进行位运算。然后再将计算结果从二进制数变回十进制数。
在这里插入图片描述

(1)二进制判断带符号的数
要判断一个二进制数是否表示负数,需要查看其最高位(最左边的位)。

以下是判断二进制数是十进制负数的方法:
1. 如果最高位(最左边的位)为0,则表示该二进制数是正数或零。
2. 如果最高位为1,则表示该二进制数是负数。此时,可以使用补码表示法来表示负数。

在补码表示法中,最高位为1表示负数,其余位表示绝对值的二进制表示形式。
可以通过将补码转换为原码,然后转换为十进制来获得负数的值。

举个例子:
假设有一个8位的二进制数:10101010
最高位为1,因此该二进制数表示负数。我们可以将其转换为负数的十进制值:
1. 首先将补码转换为原码,即将其按位取反并加1,得到原码:11010110
2. 然后将原码转换为十进制:-(11010110) = -214

因此,二进制数10101010表示的是十进制负数-214
(2)二进制和十进制换算公式
-----将二进制转换为十进制:
从二进制的最右边(个位)开始,每一位乘以2的对应次方,然后将结果相加。

例如,二进制数1101转换为十进制:
1 * 2^3 + 1 * 2^2 + 0 * 2^1 + 1 * 2^0 = 13

-----将十进制转换为二进制:
将十进制数除以2,得到的商再除以2,重复这个过程直到商为0。
将每次的余数从下往上排列,得到的结果即为二进制数。

例如,十进制数13转换为二进制:
13 / 2 = 61
6 / 2 = 30
3 / 2 = 11
1 / 2 = 01
从下往上排列余数: 1101
(3)负数二进制和十进制换算公式
负数在计算机中使用补码表示。补码是对二进制数的取反加一。

下面是负数二进制和十进制之间的换算公式:

将负数的绝对值转换为二进制:
1. 首先将负数的绝对值转换为正数的二进制表示形式。
将正数的二进制表示形式取反:
2. 将正数的二进制表示形式按位取反,即0变为11变为0,得到反码。
将反码加13. 将反码加1,得到补码。

举例说明:
将十进制数-7转换为二进制:
1. 先将7转换为二进制:7的二进制表示为0111。
取反得到反码:1000。
将反码加1得到补码:1001。

将二进制1001转换回十进制:
1. 如果最高位是1,则表示这是一个负数。所以我们需要将补码转换为负数。
2. 首先将补码减1,得到反码:10003. 对反码按位取反,得到原码:11114. 将原码转换为十进制,得到-7
(4)&按位与
表达式 3 & 5 是对整数 35 进行位与运算。
让我们将数值 35 转换为二进制形式进行位与运算:
3 的二进制表示为 00000011
5 的二进制表示为 00000101
将它们进行位与运算,得到:
  位与运算符(&)将两个操作数的每个对应位进行与运算,只有两个位都为1时,结果位才为100000011
 & 00000101
-----------
   00000001 转换为十进制:1
   3 & 5 的结果为 1
(5)|按位或
位或运算,得到:
位或运算符(|)将两个操作数的每个对应位进行或运算,只要两个位中至少有一个为1时,结果位就为100000011
 | 00000101
-----------
   00000111 转换为十进制:7 
   3 | 5 的结果为 7
(6)^按位异或
位异或运算,得到:
  位异或运算符(^)将两个操作数的每个对应位进行异或运算,当两个位不同时,结果位为1,否则为000000011
 ^ 00000101
-----------
   00000110 转换为十进制:6
   3 ^ 5 的结果为 6
(7)~按位取反
让我们将数值-4转换为二进制形式进行按位取反运算:
-4 的二进制表示为 11111100
将它进行按位取反运算,得到:
波浪号(~)表示按位取反运算。按位取反运算是一元运算符,它将操作数的每个位取反,
即将0变为1,将1变为0~ 11111100 
-----------
  00000011 转换为十进制:3
  ~-4 的结果为 3
(8)<<左移
3 的二进制表示为 00000011
将其向左移动 5 位:
它将一个数的所有位向左移动指定的位数,移动的过程中,在右侧用零填充。
00000011 << 5
-----------
01100000 转换为十进制数为 96
3 << 5 的结果为 96
(9)>>右移
将其向右移动 5 位:
它将一个数的所有位向右移动指定的位数,移动的过程中,在左侧用符号位填充
(正数用0填充,负数用1填充)。
00000011 >> 5
-----------
00000000
3 >> 5 的结果为 0
向右移动 5 位后,所有的位都被移出了,剩下的都是0
6.运算符优先级
1.最高优先级: ()
2.一元运算符: +,-, !, ~
3.乘法运算符: *, /, %
4.加减运算符: +, -
5.位移运算符:<<, >>
6.位运算符: &, |, ^
7.比较运算符: =,<=>, >=, >,<=,<,<>, !=, IS, LIKE, REGEXP, IN
8.逻辑运算符: NOT, &&, ||
9.赋值运算符: =, +=, -=, *=, /=, %=,<<=, >>=, &=, ^=, |=
3.聚合函数

将一列数据作为一个整体,进行纵向计算
注意事项:null值不参与所有聚合函数运算

#语法
select 聚合函数(字段列表) from 表名;
#求和sum()
select sum(统计的列名) from 表名;
#平均分avg()
select avg(统计的列名) from 表名;
#最大值max()
select max(统计的列名) from 表名;
#最小值min()
select min(统计的列名) from 表名;
#计数count()
#返回列名指定列的记录数,
#在统计结果的时候,会忽略列值为NULL的记录(不包括空字符串和0),
#即列值为NULL的记录不统计在内
select count(统计的列名) from 表名;
#它会对结果集中的每一行都进行计数,包括包含NULL值的行。
#这意味着它会对表的所有列都进行读取,因此可能会对性能产生一些微小的负面影响
select count(*) from 表名;
#它不会对表的所有列进行读取,而是使用一个常量(1)来进行计数。
#这种写法可以稍微提高一点性能,因为不需要对表的列进行读取和处理。
select count(1) from 表名;
4.分组查询
select 字段列表 from 表名 
[where 条件] 
group by 分组字段
having [分组后过滤条件]

where和having区别
①执行时机不同:
where是分组之前进行过滤,不满足where条件,不参与分组
having是分组之后对结果进行过滤
②判断条件不同:
where不能对聚合函数进行判断
having可以对聚合函数进行判断

5.排序查询
select 字段列表 from 表名 order by 字段1 排序方式1,字段2 排序方式2;

如果是多字段排序,当第一个字段值相同时,才会根据第二个字段进行排序

6.分页查询
select 字段列表 from 表名 limit 起始索引,查询记录数;

起始索引从0开始,起始索引=(查询页码-1)*每页显示记录数
分页查询时数据库的方言(数据库与数据库不同的地方),不同的数据库有不同的实现
如果是查询第一页数据,起始索引可以省略

七、DQL的执行顺序

在这里插入图片描述

八、DCL数据库控制

管理用户

1.查询用户
use mysql;
select * from user;
2.创建用户
#创建用户
create user '用户名'@'主机名' identified by '密码';
#创建用户,可在任意主机访问该数据库
create user '用户名'@'%' identified by '密码';
3.修改用户密码
alter user '用户名'@'主机名' identified with mysql_native_password by '新密码';
4.删除用户
delete user '用户名'@'主机名';

权限控制

在这里插入图片描述

1.查询权限
show grants for '用户名'@'主机名';
2.授予权限
grant 权限列表 on 数据库名.表名 to '用户名'@'主机名';
#授予所有表的全部权限
grant all on 数据库名.*  to '用户名'@'主机名';
3.撤销权限
revoke 权限列表 on on 数据库名.表名 from '用户名'@'主机名';

九、常用函数

MySQL 函数 | 菜鸟教程
MySQL函数大全,MySQL常用函数汇总
【如有更全可评论】

十、约束

1.概述

约束时作用于表中字段上的规则,用于限制存储在表中的数据

2.目的

保证数据库中的数据的正确、有效性和完整性

3.分类

在这里插入图片描述

4.注意事项

约束是作用于表中字段上的,可以在创建表/修改表的时候添加约束

5.约束演示

#创建一个用户表
create table user{
    #主键primary key,自增标识列auto_increment
    id int primary key auto_increment comment '主键',
    #不为空not null,唯一unique
    name varchar(10) not null unique comment '姓名',
    #大于0且小于100
    age int check( age>0 && age<=100) comment '年龄',
    #默认值
    status char(1) default '1' comment '状态',
    #无约束
    gender char(1) comment '性别'
}comment '用户表';

6.外键约束

概念:外键用来让两张表的数据之间建立连接,从而保证数据的一致性和完整性

#在创建表的时候直接添加外键
create table 表名{
    字段名 数据类型,
    ...
    constraint 外键名称fk_ foreign key(外键字段名) references 主表(主表列名)
    #constraint 坑丝准n特, references ruai服润cz
};
#添加外键
alter table 子表  add constraint 外键名称fk_ foreign key(外键字段名) references 主表(主表列名);
#删除外键
alter table 子表 drop foreign key(外键名称fk_)

7.删除/更新行为

在这里插入图片描述

alter table 子表  
add constraint 外键名称fk_ foreign key(外键字段名) 
references 主表(主表列名)
#主表外键修改或删除,子表关联外键的数据也会跟着更新或删除
on update cascade  on delete cascade;
#主表外键删除或修改,子表关联外键的数据如果可以为null会修改成null
on update set null  on delete set null;

十一、多表查询

多表关系

由于业务之间相互关联,所以各个表结构之间也存在着各种联系

  1. 一对多(多对一)
    在多的一方设置外键,关联一的一方的主键
  2. 多对多
    建立中间表,中间表至少包含两个外键,分别关联两方主键
  3. 一对一
    在任意一方加入外键,关联另外一方的主键,并且设置外键为唯一的

表连接

1.内连接[两表交集]
隐式内连接
select 字段列表 from1,2 where 条件...;
显示内连接
#INNER JOIN:如果表中有至少一个匹配,则返回行
#获取两个表中字段匹配关系的记录
select 字段列表 from1 [inner] join2 on 连接条件 ...;
2.外连接
左外连接
#查询表1(左表)的所有数据 包含 表1和表2交集的部分
#获取左表所有记录,即使右表没有对应匹配的记录
select 字段列表 from1 left [outer] join2 on 连接条件 ...;
右外连接
#查询表2(右表)的所有数据 包含 表1和表2交集的部分
#与 LEFT JOIN 相反,用于获取右表所有记录,即使左表没有对应匹配的记录。
select 字段列表 from1 right [outer] join2 on 连接条件 ...;
3.自连接

自连接查询,可以是内连接查询,也可以是外连接查询

#内连接写法
select 字段列表 from 表A 别名A join 表A 别名B on 连接条件...;
4.联合查询union

对于union查询,就是把多次查询的结果合并起来,形成一个新的查询结果
对于联合查询的多张表的列数必须保持一致,字段类型也需要保持一致

#union all直接将两条查询全部展示出来,union把去重后的数据展示出来
select 字段列表 from 表A...
union [all]
select 字段列表 from 表B...;
5.子查询[嵌套查询]
#子查询外部的语句可以是insert/update/delete/select的任何一个
#要求查询的字段类型和条件后的字段类型一致
select * from1 where 字段名1 =
(select 字段名1 from2);
#子查询多个数据的时候使用in关键字
select * from1 where 字段名1 in
(select 字段名1 from2);
①标量子查询[结果单个值]

常用操作符:等于=,不等于<>,大于等于>=,小于<,大于>,小于等于<=

#要求:查询‘销售部’的所有员工信息
#拆解1:查询‘销售部’部门ID
select 部门id from 部门表 where 部门名称='销售部';
#拆解2:根据销售部部门ID,查询员工信息
select * from 员工表 where 部门id='销售部部门id';

#子查询合并
select * from 员工表 where 部门id=(
    select 部门id from 部门表 where 部门名称='销售部'
);
②列子查询[结果为一列(可以是多行)]

常用操作符:
在这里插入图片描述

  • 操作符[not]in用法
#要求:查询‘销售部’和‘市场部’的所有员工信息
select * from 员工表 where 部门id in(
    #查询‘销售部’和市场部部门ID
    select 部门id from 部门表 
        where 部门名称='销售部' or 部门名称='市场部'
);
  • 操作符all用法
    #要求:查询比 财务部 所有人工资都高的员工信息
select * from 员工表 where 工资 > all(
    #查询所有 财务部 人员工资
    select 工资 from 员工表 where 部门id=(
        select 部门id from 部门表 where 部门名称='财务部部'
        ););
  • 操作符any/some用法
    #要求: 查询比 财务部 其中任意一人工资高(工资最低的)的信息
select * from 员工表 where 工资 > any(
    #查询所有 财务部 人员工资
    select 工资 from 员工表 where 部门id=(
        select 部门id from 部门表 where 部门名称='财务部部'
        ););
③行子查询[结果为一行(可以是多列)]

常用操作符:等于=,不等于<>,在范围内int,不在范围内not in

#要求:查询与‘无名氏’ 的工资和直属领导相同的员工信息
select * from 员工表 where (工资,直属领导id)=(
    #查询与‘无名氏’ 的工资和直属领导
    select 工资,直属领导id from 员工表  where 姓名='无名氏'
);
④表子查询[结果为多行多列]

常用操作符:在范围内in,经常出现在from之后

#要求1:查询 ‘无名氏1’和‘无名氏2’ 的职位和工资相同的员工信息
select * from 员工表 where (职位,工资) in(
    select 职位,工资 from 员工表 where name='无名氏1' 
    or name='无名氏2'
);

#要求2:查询入职日期在2000-01-01之后的员工信息,及其部门信息
select * from (
    #入职日期在2000-01-01之后的员工信息
    select * from 员工表 where 入职日期>'2000-01-01'
) as e left join 部门表 b on e.部门id=b.id;

十二、事务

1.简介

默认MySQL的事务是自动提交的,也就是说,当执行一条DML语句,MySQL会立即隐式的提交事务

  • 在 MySQL 中只有使用了 Innodb 数据库引擎的数据库或表才支持事务。
  • 事务处理可以用来维护数据库的完整性,保证成批的 SQL 语句要么全部执行,要么全部不执行。
  • 事务用来管理 insert,update,delete 语句(DML语句)

2.事务操作

//查看事务提交方式
select @@autocommit; --> 1代表当前事务自动提交
//设置事务提交方式
set @@autocommit= 0; -->0设置为手动提交
//开启事务
begin;或者start transaction;
//如果事务都能成功,提交事务
commit;
//如果事务都能有任意一个失败,即抛出异常,回滚事务
rollback;

3.四大特性ACID

原子性

原子性(Atomicity)[艾德米色踢]:一个事务(transaction)中的所有操作,要么全部完成,要么全部不完成,不会结束在中间某个环节。事务在执行过程中发生错误,会被回滚(Rollback)到事务开始前的状态,就像这个事务从来没有执行过一样
【事务是不可分割的最小操作单元,要么全部成功,要么全部失败】
在这里插入图片描述

一致性

一致性(Consistenty)[坑c思tenc]:在事务开始之前和事务结束以后,数据库的完整性没有被破坏。这表示写入的资料必须完全符合所有的预设规则,这包含资料的精确度、串联性以及后续数据库可以自发性地完成预定的工作
【事务完成时,必须使所有的数据都保持一致状态】

隔离性

隔离性(Isolation)[哎色雷神]:数据库允许多个并发事务同时对其数据进行读写和修改的能力,隔离性可以防止多个事务并发执行时由于交叉执行而导致数据的不一致。事务隔离分为不同级别,包括读未提交(Read uncommitted)、读提交(read committed)、可重复读(repeatable read)和串行化(Serializable)
【数据库系统提供的隔离性机制,保护事务在不受外部并发操作影响的独立环境下运行】
在这里插入图片描述

持久性

持久性(Durability)[几热比乐踢]:事务处理结束后,对数据的修改就是永久的,即便系统故障也不会丢失。
【事务一旦提交或回滚,它对数据库中的数据的改变就是永久的】
在这里插入图片描述

4.并发事务问题

在这里插入图片描述

脏读

在这里插入图片描述

不可重复读

在这里插入图片描述

幻读

在这里插入图片描述

5.事务隔离级别

数据库事务的四种隔离级别

//查看事务隔离级别
select @@transaction_isolation;
//设置事务隔离级别
set [session|global] transaction isolation level {read uncommitted|read committed|repeatable read|serializable};
session:当前会话,针对当前客户端窗口有效
global:针对所有客户端窗口有效

十三、存储引擎

1.MySQL体系结构

关于MySQL的体系结构及存储引擎图解
MySQL 存储引擎

  1. 连接层:最上层是一些客户端和链接服务,主要完成一些类似于连接处理、授权认证、及相关的安全方案。
    服务器也会为安全接入的每个客户端验证它所具有的操作权限。

  2. 服务层:第二层架构主要完成大多数的核心服务功能,如SQL接口,并完成缓存的查询,SQL的分析和优化,部分内置函数的执行。
    所有跨存储引擎的功能也在这一层实现,如 过程、函数等。

  3. 存储引擎层:存储引擎真正的负责了MySQL中数据的存储和提取,服务器通过API和存储引擎进行通信。
    不同的存储引擎具有不同的功能,这样我们可以根据自己的需要,来选取合适的存储引擎。
    索引是在存储引擎层实现的,innoDB是在mysql5.5后默认的存储引擎。

  4. 存储层:主要是将数据存储文件系统之上,并完成与存储引擎的交互。

2.简介

存储引擎 就是存储数据、建立索引、更新/查询数据等技术的实现方式。
存储引擎是基于表的,而不是基于库的,所以存储引擎也可被称为表类型

//在创建表时,指定存储引擎
create table 表名(
     字段名 字段类型    
)engine =innodb;
//查看当前数据库支持的存储引擎
show engines;

3.特点

①InnoDB
1.介绍

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

2.特点
  • DML(增删改)操作遵循ACID(四大特性)模型,支持事务;
  • 行级锁,提高并发访问性能
  • 支持外键foreign key约束,保证数据的完整性和正确性
3.磁盘文件

xxx.idb :xxx代表的是表名,innoDB引擎的每张表都会对应这样一个表空间文件,
存储该表的表结构(frm[8.0之前]、sdi[8.0之后在数据字典中])、数据和索引。
参数:innodb_file_per_table[mysql8.0开关默认打开]:

//查看系统变量
show variables like '';
//cmd指令,从idb文件中提取sdi表结构数据
idb2sdi 表名.idb
4.逻辑存储结构

在这里插入图片描述

Tablespace:表空间
Segment:段
Extent:区
Page:页
Row:行
Trx id:最后一次操作事务的id
Roll pointer:指针
col:字段
每一行对应的是一个Student实体,在数据库中称之为一个“记录”
②MyISAM
1.介绍

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

2.特点
  • 不支持事务,不支持外键
  • 支持表锁,不支持行锁
  • 访问速度快
3.磁盘文件

xxx.sdi:存储表结构信息
xxx.MYD:存储数据
xxx.MYI:存储索引

③Memory
1.介绍

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

2.特点
  • 内存存放,访问速度快
  • 支持hash索引(默认)
3.磁盘文件

xxx.sdi:存储表结构信息

④引擎特点区别

在这里插入图片描述

4.存储引擎选择场景

  • InnoDB :是MySQL的默认存储引擎,支持事务、外键。如果应用对事务的完整性有比较高的要求,在并发条件下要求数据的一致性,数据操作除了插入和查询之外,还包括很多的更新、删除操作

  • MyISAM :如果应用是以读操作和插入操作为主,只有很少的更新和删除操作,并且对事务的完整性、并发性要求不是很高,例如:业务系统中的日志,电商中的足迹和评论【MongoDB替代】

  • Memory :将所有数据保存在内存中,访问速度快,通常用于临时表及缓存。缺点对表的大小有限制,太大的表无法缓存在内存中,而且无法保障数据的安全性【Redis替代】

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值