一、性能分析
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、聚簇索引与非聚簇索引
聚簇索引:数据行的物理顺序与列值(一般是主键的那一列)的逻辑顺序相同,一个