【MySQL】幽深不可测,登此方觉心

详解Mysql安装教程

一、MySQL基础

1、MySQL是什么?

MySQL是一种用关系型数据库管理系统的软件。它是一种开源数据库,可以利用它来存储、管理和访问各种类型的数据。MySQL可用于多种应用程序,包括网站、电子商务系统、移动应用程序、企业级应用程序等等。MySQL支持标准SQL查询语言,可以在多个操作系统上运行,包括Windows、Linux、Unix等。

2、如何使用MySQL?

2.1 创建数据库表

create table 表(字段名、数据类型、约束)
// 示例:
create table t_student(
	s_no int(6), -- (6) 表示显示长度
	s_name varchar(5),
	age tinyint(3),
	sex char(1),
	class_name varchar(10)
);

2.2 use 数据库名 打开指定数据库

drop table 表名 删除指定表
// 示例:
drop table table t_student

2.3查看表结构 desc t_student;

2.4查看建表语句 show create table t_student;

2.5 修改表结构

(1)添加字段

alert table 表名 add 字段名 数据类型
alert table 表名 add 字段名 数据类型 after 字段名  将添加的字段插入到指定字段之后

(2)删除字段

alert table 表名 drop 字段名

(3)修改字段

alert table 表名 modify 字段名 数据类型  用于修改指定字段数据类型
alert table 表名 change 旧字段名 新字段名 数据类型  用于修改指定字段名及数据类型

(4)添加约束

alert table 表名 add constraint 约束名 约束关键字 (字段名)

2.6 数据类型

(1)整数类型

tinyint smallint mediumint int bigint
1字节 2字节 3字节 4字节【4表示显示长度】 8字节

(2)浮点型

float double
4字节【浮点型(5, 2) 5表示显示总宽度,2表示小数位数,且不会自动扩充】 8字节

(3)字符串类型

char(m) varchar(m)
0~m 个定长字符串 0~m 个边长字符串

(4)日期和时间类型

time HH:MM:SS
date YYYY-MM-DD
year YYYY
datetime YYYY-MM-DD HH:MM:SS
timestamp YYYY-MM-DD HH:MM:SS

2.7 数据插入

-- insert into 表名 (字段名,字段名...) values (字段值,字段值...)
// 示例
insert into t_student values (100101, '张三', 18, '男', '计算机一班');
insert into t_student values (null, '李四', 20, null, '计算机二班');

2.8 数据更新

update t_student set 字段名 = 字段值 where 条件
update t_student set age = 20 where s_no = 100101;

2.9 快速添加表

create table 表名 as select * from t_student

2.10 数据删除

delete from 表名 where 条件
delete from t_student; truncate from t_student;

2.11 delete 和 truncate 的区别?

1、delete为DML语言,truncate为DDL语言;
2、delete是将表中数据一条一条删除,而truncate则是保留表结构重新创建表,相对而言truncate效率更高;
3、delete操作可以回滚,而truncate操作会导致隐式提交,不能回滚;
4、delete或返回被删除的行号,对于自增字段来说会从删除前最大值+1开始,truncate操作通常返回0,对于自增字段会从1开始

3、数据库约束

3.1 基础知识

primary key 主键约束
not null 非空约束
unique 唯一约束
check 检查约束
default 默认值约束
foreign key 外键约束
-- 建表时添加列约束
create table t_student(
	s_no int(6) primary key auto_increment,
	s_name varchar(5) not null,
	age tinyint(3) check(age >= 18 and age <= 50),
	sex char(1) default '男' check(sex = '男' || sex = '女'),
	class_name varchar(10) not null
);

-- 建表时添加表约束

-- constraint 约束名 约束关键字 (字段名)

create table t_student(
	s_no int(6), -- (6) 表示显示长度
	s_name varchar(5),
	age tinyint(3),
	sex char(1),
	class_name varchar(10),
	constraint pk_stu primary key (s_no),
	constraint ck_stu_age check (age >= 18 and age <= 50),
	constraint ck_stu_sex check (sex = '男' || sex = '女')
);

-- 创建表之后添加约束

alert table t_student add constraint pk_stu primary (s_no);

-- 创建表时添加外键约束
create table t_student(
	s_no int(6) primary key auto_increment,
	s_name varchar(5) not null,
	age tinyint(3) check(age >= 18 and age <= 50),
	sex char(1) default '男' check(sex = '男' || sex = '女'),
	c_no int(6),
	constraint fk_stu_c_no foreign key (c_no) references t_class (c_no)
);

3.2 外键约束策略

(1)no action 默认不允许操作;
(2)cascade 级联操作,操作主表是影响从表的数据;下面是一些常见的Cascade级联操作:

Cascade Delete(级联删除):删除一个表中的记录时,自动将与其有关联的其他表中的记录一并删除。

Cascade Update(级联更新):更新一个表中的记录时,自动将与其有关联的其他表中的记录一并更新。

需要注意的是,Cascade级联操作会对其他表中的数据进行直接操作,因此需要谨慎使用,确保操作的正确性和安全性。同时,Cascade级联操作应该与引用完整性约束一起使用,以保证数据的一致性和完整性。
// 示例:
alert table t_student add constraint fk_stu_c_no foreign key (c_no) references t_class (c_no) on update cascade on delete cascade

(3)set null 置空操作

UPDATE table1 SET column1 = NULL WHERE condition;

3.3 select 字段名 as 别名 form 表名 where 查询条件 group by 字段名 order by 字段名 asc/desc

3.4 去重

select distinct 字段名 from 表名

3.5 查询条件 【binary 用于区分大小写】

MySQL默认不区分大小写,但是可以使用binary运算符来区分大小写。在使用binary运算符时,会将字符视为二进制数据来比较,这就会严格区分大小写
例如,SELECT * FROM users WHERE binary username = ‘admin’会只返回与’admin’完全匹配的用户名,而不会返回’Admin’或’ADMIN’。

4、函数

4.1单行函数

单行函数: 指对每一条记录进行计算并得到相应的结果返回给用户,主要包括:字符串函数、数值函数、日期时间函数、流程函数以及其它函数。

1.1字符串函数

lower() 转换为小写
upper() 转换为大写
length() 获取字符串长度
subString(str,2,3) 截取字符串 2:从第二个字符开始截取 3:截取3个长度的字符

1.2 数值函数

abs() 获取绝对值
upper() 转换为大写
length() 获取字符串长度
subString(str,2,3) 截取字符串 2:从第二个字符开始截取 3:截取3个长度的字符

1.3 日期时间函数

curdate() 获取当前年月日
curtime() 获取当前时分秒
now() 获取当前sql执行时的年月日 时分秒
sysdate() 获取函数执行时的年月日 时分秒

1.4 流程函数

if(a, t, f) 如果条件a成立,返回t,否则返回f
ifnull(v1, v2) 如果v1不为空则返回v1,否则返回v2
nullif(v1, v2) 如果v1等于v2,则返回null,否则返回v1

4.2 多行函数

多行函数: 指对一组数据进行计算,针对一组数据返回一个结果,也称为分组函数。

max() 获取最大值
min() 获取最小值
count() 统计数量
sum() 求和
avg() 求平均值

5、连接查询

1、cross 交叉连接

select * from emp cross join dept;
缺点:会将两张表中所有数据进行关联,造成很多无用的数据  ==>  笛卡尔积

2、natural 自然连接

select * from emp natural join dept;
缺点:会自动匹配表中所有同名列

3、natural 自然连接 使用using(字段)指定关联字段

select * from emp join dept using(d_no)
缺点 using子句使用时,两张便关联字段必须一致

4、inner join 内连接

select * from emp e inner join dept d on e.d_no = d.d_no
缺点:只能查询到匹配的信息,可能导致数据不完全

5、left outer join 左外连接

select * from emp e left outer join dept d on e.d_no = d.d_no
展示出左表所有数据

6、right outer join 右外连接

select * from emp e right outer join dept d on e.d_no = d.d_no
展示出右表所有数据

7、full outer join 全外连接

mysql 不支持 使用union获取左外连接和右外连接的并集
外连接中outer可以省略

6、子查询

1、不相关子查询 => 子查询可以独立运行,sql执行时先执行子查询,再执行外部查询

select * from emp where d_no = (select d_no from dept where loc = '北京')

2、相关子查询 => 子查询不可单独运行,子查询的查询条件依赖于外部数据

select * from emp e where d_no = (
	select d_no from dept where d_no = e.d_no
)
select * from emp where d_no = (select d_no from dept where loc = '北京')
select * from emp e where d_no = (select d_no from dept where d_no = e.d_no)

7、事务

7.1 概念: 事务指一个操作序列,该操作序列中各个操作要么都执行,要么都不执行,是一个不可分割的整体。

InnoDB支持事务,是Mysql5.5以后默认的存储引擎
myisam不支持事务,是Mysql5.5以前默认的存储引擎

7.2 事务的特性:ACID特性

原子性(Atomicity) 事务中所有的操作可以看作一个原子,不可再分
一致性(Consistency) 指事务执行的结果必须使数据库从一个一致性状态变道另一个一致性状态,通过原子性来保证
隔离性(Isolation) 指各个事务的执行互不干扰,任意一个事务的内部操作对其他并发的事务都是隔离的
持久性(Durability) 指事务一旦提交,对数据库的任何改变都要永久记录

7.3 SQL操作

开启事务 start transaction
事务回滚 rollback;
手动提交事务 commit;

7.4 事务并发问题

1、脏读:当一个事务正在对数据进行了修改,而修改还没有提交到数据库中,这时另一个事务访问这个数据,然后使用了数据。这时候由于第一个事务对数据的更改还没有提交,所以导致第二个事务所读取的数据是不正确的,也就是“脏数据”
2、不可重复读:当一个事务多次读取一个数据,在这个事务还没有结束时,另一个事务也访问该数据并进行了修改,导致第一个事务在多次读取数据时可能得到不一样的结果。这种现象被称为“不可重复读”
3、幻读:当一个事务读取数据时,第二个事务进行了数据的插入。这时候第一个数据就会查询到一些原本不存在的数据,这种现象被称为“幻读”

8、视图

8.1 概念

从一张或多张数据表或其他视图中构建出来的虚拟表。好处:简化用户操作,对机密数据提供保护

8.2 创建视图

create view my_view
as select * from emp
where 条件
with check option

8.3 存储过程

1、定义一个没有返回值的存储过程

create procedure mypro(name varchar(10))
begin
if name is null or name = '' then
select * from emp;
else select * from emp where e_name like concat('%', name,'%');
end if;
end;

2、调用存储过程

call mypro(null);

3、删除存储过程

drop procedure mypro1;

4、定义一个没有返回值的存储过程

create procedure mypro1(in name varchar(10), out num int(3))
begin
if name is null or name = '' then
select * from emp;
else select * from emp where e_name like concat('%', name,'%');
end if;
select found_rows() into num;
end;
call mypro1(null, num); select @num;

二、MySQL优化设计

1、范式化设计

①第一范式:表中的所有属性不可再分,强调数据表的原子性;
②第二范式:在第一范式基础上要求实体的属性完全依赖于主关键字;
③第三范式:在第二范式基础上要求数据库表中不包含已经在其他表中存在的非关键字信息,即数据不能存在传递关系;

2、反范式化设计

为了提高性能和读取效率而适当的违反数据库设计范式的要求。为了查询的性能,允许存在部分或少量的冗余数据。反范式化设计可以减少查询时数据库表的关联,提高索引的命中,进而提高查询效率。
1、缓存与汇总数据:将一些简单的数据继续冗余;
2、计数器表设计:在高并发场景中为了提高数据的插入,可以引入slot;

update read_count set count = count + 1 where id = 1;

由于mysql存在互斥锁,导致上面修改语句只能支持单线程去修改

为了提高效率可以引入slot

update read_count set count = count + 1 where id = 1 and slot = 1;

update read_count set count = count + 1 where id = 1 and slot = 2;

update read_count set count = count + 1 where id = 1 and slot = 3;

这时候就支持三个线城同时去修改id为1的记录的点击数了。有几个slot就支持多少个线城并发修改

3、字符数据类型优化

基本原则:①更小的通常更好;②简单就好;③尽量避免NULL;

在MySQL中null值需要特殊的处理。索引统计将会更加复杂,同时需要多记录一个额外的字节,导致null会占用更多的空间
更小的数据类型所占空间【磁盘、内存、CPU高速缓存】更小,计算更快

整数,浮点数

1、整数字段在确定不会有负数的情况下可以将该字段设置为无符号的整形,可以存储更多的数据;
2、浮点数中decimal可以存储65哥数字。在底层时使用字符串来存储的,相对来说效率更低,精度更高;
3、在一些场景中需要使用实数,同时还需要确保精度与效率,可以使用bigint来存储;

字符串,日期

char() 定长的,更省空间。没有记录的长度

varchar() 不定长的,需要1~2个额外的空间记录字符串的长度

在使用blob,text时可以将相应字段独立出一张子表去存储

datetime可以存储 1001年到9999年

timestamp可以存储1970年到2038年

命名规范

1、可读性原则:表名或者字段名尽量不用缩写,表名的规范:业务名称+表的作用
2、必须使用小写字母加数字:windows是不区分大小写的,但是在Linux中是区分大小写的,为了避免平台的冲突应该使用小写
3、不使用复数名词
4、禁用保留字
5、索引命名:索引是帮助MySQL高效获取数据的数据结构
InnoDB存储引擎中支持的常见索引:B+树索引(关键),全文索引,哈希索引(内部)

三、MySQL索引

1、索引是什么?

在mysql中,索引是一种特殊的数据库结构,由数据表中的一列或多列组合而成,可以用来快速查询数据表中有某一特定值的记录。通过索引,查询数据时不用读完记录的所有信息,而只是查询索引列即可。

2、索引分类

1、B-树索引,使表中的每一行都会在索引上有一个对应值;

2、哈希索引,可根据索引列对应的哈希值的方法获取表的记录行;

3、普通索引,允许在定义索引的列中插入重复值和空值;

4、唯一索引,可以避免数据出现重复;

5、主键索引,是为主键字段创建的索引;

6、空间索引,是对空间数据类型的字段建立的索引;

7、全文索引,用来查找文本中的关键字;

8、单列索引,即索引只包含原表的一个列。

3、索引创建策略

1、主键索引:在创建表时,尽可能地为每个表定义一个主键。主键是一种唯一标识符,通常是一个自增的整数。主键索引是一种特殊的 B-tree 索引,它可以在查询主键时提供非常高的查询效率。
2、唯一索引:如果表中的某些列需要保证唯一性,可以为这些列创建唯一索引。唯一索引可以加速唯一性查询和去重操作,但会占用更多的存储 空间。
3、B-tree 索引:B-tree 索引是 MySQL 中最常用的索引类型。它支持等值查询、范围查询、排序和分组等操作。B-tree 索引的创建策略通常是根据查询需求和数据分布来选择合适的列和方向。
4、哈希索引:哈希索引是一种基于哈希表的索引类型,它适用于等值查询,但不适合范围查询和排序。哈希索引的创建策略通常是在小数据量的情况下使用,以提高查询效率。
5、全文索引:全文索引是一种特殊的索引类型,它适用于文本类型的数据,如字符串、文本和 JSON 类型。全文索引可以加速全文搜索和模糊匹配操作,但需要占用更多的存储空间。
6、多列索引:多列索引是一种将多个列组合在一起的索引类型,它可以在多个列上进行查询和排序。多列索引的创建策略通常是在需要同时查询多个列的情况下使用。

总之,MySQL 中索引的创建策略需要根据具体的情况进行选择,以提高查询效率和减少存储空间的占用。

四、MySQL调优

1、慢查询基础-优化数据访问

(1)请求了不需要的数据

  • 查询不需要的记录
select * from 表名 limit 1000020

对于上诉sql,我们需要的之后后面的20条记录,但是MySQL会多查询出前面的10000条记录,那么这10000条记录就是不需要的记录
  • 总是取出全部列
select *;  这样的话就会很大程度造成全表扫描。所以尽量不要使用select *,而是需要查询哪些字段,我们就写那些字段,然后对这些字段建立相应的一个索引,可以提高查询效率
  • 重复查询相同的数据
在实际业务中,很多时候会对一些不经常发生变化的数据进行多次查询,可以把这部分数据存在redis中做缓存。

(2)是否在扫描额外的记录

  • 响应时间:
MySQL中响应时间 = 服务时间(sql真正执行处理的时间)+ 排队时间(MySQL中的一些锁机制等导致sql在排队)
  • 扫描的行数和返回的行数
  • 扫描的行数和访问类型
总结:
1. 尽量使用覆盖索引,
2. 数据表结构优化。在统计汇总的时候可以创建汇总表
3. 重写复杂的SQL

2、慢查询

慢查询:MySQL会记录所有执行时间超过long_query_time(默认10s)参数设定的阈值的SQL语句的一个日志信息

-- 查询慢查询的配置状况
show variables like 'slow_query_log';

-- 配置慢查询状态
set global slow_query_log = 1;  1 => 打开,2 => 关闭

-- 查询long_query_time
show variables like 'long_query_time';

set global long_query_time = time;  time => 单位秒

-- 查询慢查询日志位置
show variables like 'slow_query_log_file';

-- log_queries_not_using_indexes 表示没有用到索引的SQL日志
show variables like 'log_queries_not_using_indexes';

set global log_queries_not_using_indexes = 1

mysqldumpslow命令 可以对慢查询日志进行过滤显示

mysqldumpslow -s r -t 10 文件路径

-s: 排序
r => 结果行数 
c => 执行次数
t => 时间
l => 锁
-t 10 => 查看前10条

3、执行计划

语法:在SQL语句前面加上explain关键字

【MySQL】幽深不可测,登此方觉心_第1张图片
(1)id

查询语句中没出现一个select关键字(以查询优化器优化之后的语句为准),MySQL就会给他分配一个唯一的id值。使用union关键字时,需要临时表将结果去重,所以会多一条id为null的执行计划。

(2)select_table

通过某个小查询的select_type属性,就知道小查询在整个大查询中扮演的角色

 - SIMPLE:简单的select查询,不适用union及子查询 
 - PRIMARY:最外层的select查询
 - UNION:UNION中第二个或随后的select查询,不依赖于外部查询的结果集 
 - UNION RESULT:UNION结果集
 - SUBQUERY:子查询中的第一个select查询,不依赖于外部查询结果集 DEPENDENT
 - UNION:UNION中第二个或随后的select查询,依赖于外部查询的结果集 DEPENDENT
 - SUBQUERY:子查询中的第一个select查询,依赖于外部查询结果集
 - DERIVED:用于form子句中有子查询的情况。MySQL会递归执行这些子查询,把结果放在临时表中

(3)table:表示查询的表名称
(4)parititions 和分区有关
(5)type

代表MySQL对某个表执行查询的访问方式/访问类型,是一个较为重要的指标。结果值从最好到最坏为:

system > const > eq_ref > ref > fulltext >ref_or_null > index_merge > unique_subquery >                                      index_subquery > range > index > ALL

出现比较多的是 system > const > eq_ref > ref > range > index > ALL

一般来说需要保证查询至少达到range级别

4、高性​​能索引使用策略

1、不在索引列上做任何操作

explain select * from customer where id + 1 = 5
这条SQL的话就是在主键索引上面进行了表达式的操作,这样MySQL就不会用到索引,会造成全表扫描

2、尽量全值匹配:尽量保证查询条件字段和联合索引的字段完全匹配

3、最佳左前缀法则:查询SQL中的条件字段尽量保证在联合索引中的第一个字段,否则会导致全表扫描

4、范围条件放在最后

在联合索引中,尽量最左边的列做精确查询,则右边的列可做范围查询。如果中间列进行范围查询则会导致后面的所有列失效

5、尽量使用覆盖索引:尽量不要使用*
6、不等于要慎用:使用 !/<> 回导致索引失效,进行全表扫描
7、Null/Not有影响
8、字符类型加引号
9、使用or关键字要注意
10、排序时,ASC、DESC别混用。在连表查询时,order by 第一张表的字段时才会使用到索引
11、尽可能按照主键顺序进行插入
12、优化count查询 count只会查询非空的数据

五、MVCC与版本链

undo日志:InnoDB数据库引擎中会对表中数据的每次变动生成一条日志记录,存放在undo日志中

【MySQL】幽深不可测,登此方觉心_第2张图片
【MySQL】幽深不可测,登此方觉心_第3张图片

MySQL通过MVCC解决事务并发问题。具体来讲,MVCC就是通过ReadView,也就是说在查询的时候生成ReadView(快照),通过判断事务ID和undo日志来决定读取那条记录。

在read committed 隔离级别中,每次查询时都会生成一个ReadView,可以解决脏读,但是会有不可重复读的问题。因为两个数据读取时生成的ReadView可能不一致

在repeatable read 隔离级别中,同一个事务中的只会在第一次读取时生成一个ReadView,解决不可重复读的问题。同时也解决了一部分幻读的问题。也就是说在一些特殊情况下,还是可能会出现幻读问题的。

​

​从上边的描述中我们可以看出来,所谓的MVCC (Multi-Version Concurrency Control,多版本并发控制)指的就是在使用READ COMMITTD、REPEATABLE READ这两种隔离级别的事务在执行普通的SELECT操作时访问记录的版本链的过程,这样子可以使不同事务的读-写、写-读操作并发执行,从而提升系统性能。

READ COMMITTD、REPEATABLE READ这两个隔离级别的一个很大不同就是: 生成ReadView的时机不同READ COMMITTD在每一次进行普通SELECT操作前都会生成一个ReadView,而REPEATABLE READ只在第-次进行普通SELECT操作前生成一个ReadView,之后的查询操作都重复使用这个ReadView就好了,从而基本上可以避免幻读现象 (就是第一次读如果ReadView是空的情况中的某些情况则避免不了)

另外,所谓的MVCC只是在我们进行普通的SEELCT查询时才生效,截止到目前我们所见的所有SELECT语句都算是普通的查询

六、MySQL中的锁【锁是用来解决并发问题的】

【MySQL】幽深不可测,登此方觉心_第4张图片

1、解决事务并发问题两种方式

(1)读操作使用MVCC,写操作进行加锁
(2)读写操作都使用加锁的方式

2、锁的分类

(1)共享锁(Shaerd Locks) S锁

多个事务可以同时持有同一把锁
select 语句... lock in share mode; => 共享锁

(2)独占锁(Exclusive Locks) X锁

同一时间一个事务只能持有一把锁,其他事务则会阻塞
select 语句... for update; => 独占锁

(3)写操作的锁

delete:通过B+树定位到该记录,然后获取该记录的X锁
insert:不需要加锁
update:分三种情况
要修改的记录在修改前后所在的存储空间没有发生变化,只需要获取该记录的X锁
修改前后所在的存储空间发生变化时,首先通过B+树定位到该记录,获取X锁,然后将该记录彻底删除之后,重新插入新的记录,同时或获取新纪录的X锁

3、锁的粒度

【MySQL】幽深不可测,登此方觉心_第5张图片

4、MySQL中的行锁和表锁

行锁,表锁和存储引擎有关。非InnoDB的存储引擎中只有表锁

lock tables 表名 read;   => 表锁,共享级别的

lock tables 表名 write;   => 表锁,独占级别的

在特殊情况下(崩溃,恢复过程中)才会使用,一般不使用

行锁:加载索引上的才是行锁

AUTO-INC锁

间隙锁:InnoDB在加行锁的时候会在该记录前后加间隙锁。

死锁:MySQL中如果两个事务同时抢夺同一资源的锁会造成死锁情况。这时候MySQL会把最后一个想要获取锁的线城重启来解决死锁问题。

意向锁:

解决表锁的效率问题

某个事务在某条记录加共享锁的时候首先需要在表级别加一个意向共享锁(IS锁)

意向独占锁(IX锁)

六、MySQL8新特性【MySQL5.7 将在2023-10-31停止维护】

1、账户与安全

5.7版本及之前,用户的创建与授权可以通过一条SQL实现,而8.0之后需要分开执行

1.1、用户创建和授权

-- 5.7

grant all privileges on *.* to '用户名'@'%' identified by '密码'; 创建用户并授权

-- 8.0

create user '用户名'@'%' identified by '密码';  -- 创建用户

grant all privileges on *.* to '用户名'@'%';      -- 为用户授权

1.2、认证插件更新

MySQL5.7之前和8.0之后的认证插件不一样

mysql_native_password  -- MySQL5.7

caching_sha2_password  -- MySQL8.0

show variables like 'default_authentication_plugin'  -- 查看MySQL默认的认证插件

1.3、密码管理

【MySQL】幽深不可测,登此方觉心_第6张图片

password_history:新密码不能与最近几次的密码重复   0 => 密码可以随意更改,可以重复设置

password_require_current:修改密码时,是否需要校验旧密码

password_reuse_interval:新密码不能与最近几天的密码重复

2、索引增强

2.1、隐藏索引

create index 索引名 on 表名(字段名) invisible;  -- 创建隐藏索引

show index from emp      -- 查看表中的索引

-- 设置当前会话中的隐藏索引生效

set session optimizer_switch="use_invisible_indexes=on" 

-- 修改隐藏索引可见/不可见

 alter table 表名 alter index 索引名 visible/invisible;

不会被优化器使用,对于MySQL来说是不可见的。

作用:

1.软删除:index的删除和创建都会消耗性能。MySQL8.0中可以将需要暂时删除的索引变成隐藏索引,

2.灰度发布:可以在生产环境创建隐藏索引,这样对原来的业务是没有任何影响的。然后通过设置session级别的隐藏索引生效之后进行测试,每有问题之后将隐藏索引设置为可见的即可

2.2、降序索引

create index 索引名 on 表名(字段名 desc)  -- 创建 降序索引 

2.3、函数索引

create index 索引名 on 表名( (函数名(字段名)) )  -- 创建函数索引

3、通用表达式(CTE)

with recursive etc(n) as
(
select 1
union all
select n+1 from etc where n < 10
)
select * from etc

4、函数窗口

分析函数,分组,聚合 sum、avg、count、max、min

select
year,country,product, sum![请添加图片描述](https://img-blog.csdnimg.cn/e4f3737cba864403bd103a250fa98319.png)
,
sum(sum) over (PARTITION by country) as country_sum
from sales
order by country,year,product,sum;

【MySQL】幽深不可测,登此方觉心_第7张图片

【MySQL】幽深不可测,登此方觉心_第8张图片

连接层
【MySQL】幽深不可测,登此方觉心_第9张图片
Server层:SQL解析,缓存,优化

【MySQL】幽深不可测,登此方觉心_第10张图片

存储引擎:相对于表来说的,也就是说可以为不同的表选择不同的存储引擎

【MySQL】幽深不可测,登此方觉心_第11张图片
MySQL中的目录与文件

【MySQL】幽深不可测,登此方觉心_第12张图片
MySQL日志文件

1.错误日志
2.慢查询日志
3.查询日志
4.二进制文件(binlog)

||||、相关面试题

1、定长字符串和边长字符串是什么?【char和varchar的区别?】

(1)定长字符串【有多少占多少】

定长字符串使用 CHAR 关键字定义,存储时会预先分配固定长度的存储空间。例如,定义一个长度为10的 CHAR 类型字段,无论里面存储的字符串是否达到了10个字符的长度,都会占用10个字符的存储空间。如果存储的字符串不足10个字符,则多余的空间会被填充空格字符。

(2)边长字符串【存储多少占多少】

边长字符串使用 VARCHAR 关键字定义,存储时只分配实际存储的长度,字符串长度可以根据存储的字符串动态变化。例如,定义一个长度为10的 VARCHAR 类型字段,如果存储的字符串只有5个字符,则只会占用5个字符的存储空间。

在使用字符串类型时,需要根据实际需求选择合适的类型,例如如果存储的字符串长度相对固定,可以选择 CHAR 类型;如果存储的字符串长度会变化,可以选择 VARCHAR 类型

2、DDL、DML、DCL区别?

一、DDL
DDL(data definition language)数据定义语言,用户定义和管理sql数据库中所有对象的语言。
主要命令:create、alter、drop等

二、DML
DML(data manipulation language)数据操作语言。
主要命令:select、update、insert、delete等

三、DCL
DCL(date control language)数据库控制功能。
主要命令:grant、deny、revoke、commit、savepoint、rollback等
注意:DCL一般只有sysadmin、dbcreator、db_owner、db_securityadmin等人员有权限操作

相关文章

MySQL之binlog用法及介绍

你可能感兴趣的:(数据库,mysql,数据库)