Mysql高级一锅端

本文深入探讨了MySQL的性能分析,包括SQL执行慢的原因、Join查询的7种类型、索引的概念及其结构(如B+树)。重点介绍了索引的创建、选择性和使用场景,并详细解析了Explain执行计划,强调了如何避免索引失效的策略,如遵循最左前缀法则。最后,文章提供了单表、关联表和子查询的索引优化建议,以及面试中可能遇到的相关问题。
摘要由CSDN通过智能技术生成

一、性能分析

1、性能下降SQL慢(执行时间长,等待时间长)的原因

下面感觉是废话,查询语句写的烂才导致索引失效,总体就三点,SQL写的烂,数据量大,服务器调优不好

2、常见的通用Join查询

SQL手写执行顺序和SQL在机器中读取顺序

手写:

select district 查询字段
from 表名1
[left]/[right]/[inner] join 表名2
on 表1.字段=表2.字段
where 查询条件
group by 分组字段
having 分组后判断条件
order by 排序字段 [asc|desc]
limit 分页字段

 机器:

1.执行from 表名1
2.执行 on 关联条件得到它们的交集
3.执行[left|right|inner] join 表名2
4.执行 where 判断条件
5.执行 group by 进行分组
6.执行 having 对结果再次进行筛选
7.执行select
8.执行 order by 进行排序
9.执行limit

下面的是对应的7中Join查询

学习文档:https://blog.csdn.net/software_Manito/article/details/108326619

友情提示:mysql的join没有全表的full out join,只能使用union,这个关键字会将重复的内容只取一份

下面的对应上面的图片的7种查询

练习Join的7种情况

/**部门表*/
create table tbl_dept(
id int not null primary key auto_increment,
deptname varchar(30) default null,
locAddr varchar(40) default null
);


/**员工表*/
create table tbl_emp(
id int not null primary key auto_increment,
empName varchar(30) default null,
deptld int not null,
constraint fk_emp_dept foreign key (deptld) references tbl_dept(id)
);

insert into tbl_dept values (null,'RD',11),(null,'HR',12),(null,'MK',13),(null,'MIS',14),(null,'FD',15);

insert into tbl_emp values (null,'zs1',1),(null,'zs2',1),(null,'zs3',1),(null,'wangwu1',2),(null,'王五2',2);

alter table tbl_emp modify empName varchar(30) character set utf8;
-- 员工表和部门表内连接
select * from tbl_emp e inner join tbl_dept d on e.deptld = d.id;

-- 左连接
select * from tbl_emp e left join tbl_dept d on e.deptld = d.id;

-- 右连接
select * from tbl_emp e right join tbl_dept d on e.deptld = d.id;


-- 左外连接

select * from tbl_emp e left join tbl_dept d on e.deptld = d.id where d.id is null;

-- 右外连接
select * from tbl_emp e right join tbl_dept d on e.deptld = d.id where e.deptld is null;


-- 全连接(mysql 不支持full outer )

select * from tbl_emp e left join tbl_dept d on e.deptld = d.id 
UNION 
select * from tbl_emp e right join tbl_dept d on e.deptld = d.id;



select * from tbl_emp e left join tbl_dept d on e.deptld = d.id  where d.id is null 
UNION 
select * from tbl_emp e right join tbl_dept d on e.deptld = d.id where e.deptld is null;

3、什么是索引

       索引是帮助mysql高效获取数据的数据结构.在数据之外,数据库系统还维护着满足特定查找算法的数据结构,这些数据结构以某种方式引用数据,这样就可以在这些数据结构上实现高级算法.这种数据结构,被称为索引。从本质上来说,索引就是数据结构.可以简单地理解为:索引是排好序的快速查找的数据结构.是为了解决SQL数据过于庞大引起效率下降的优化方案

为什么Mysql索引不用二叉树?

如果插入的数据是连续的,优先考虑的应该是链表,这样想到的应该是B树(又叫平衡树)

结论

数据本身之外,数据库还维护着一个满足特定查找算法的数据结构,这些数据结构以某种方式指向数据,这样就可以在这些数据结构的基础上实现高级查找算法,这种数据结构就是索引(B+树 或 Btree+)是B+树不是B树

索引的优势和劣势

劣势中为什么更新表会变慢

如对表进行 insert / update / delete 因为更新表时,Mysql不仅要保存记录,还要保存一下索引文件每次更新添加了索引列的字段,都会调整因为更新带来的键值变化后的索引信息。间隙锁
delete 删除一个数据后,数据之间会留下一个间隙 --后面会说

索引结构(重点)

1、快速理解平衡二叉树(AVL树)、B-tree(B树)、B+tree、B*tree(想了解RB树(红黑树)的可以百度)

参考地址:https://www.pianshen.com/article/48761526321/

简单理解参考地址:https://my.oschina.net/u/3370829/blog/1301732

参考地址:https://blog.csdn.net/v_JULY_v/article/details/6530142/

2、红黑树的区别

3、那么为什么说B+树比B-树更适合实际应用中操作系统的文件索引和数据库索引?

4、聚簇索引与非聚簇索引

聚簇索引:数据行的物理顺序与列值(一般是主键的那一列)的逻辑顺序相同,一个

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

越来越没意思

你的鼓励将是我最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值