(1)B站视频:尚硅谷MySQL数据库高级,mysql优化,数据库优化(周阳老师):https://www.bilibili.com/video/BV1KW411u7vy?p=11
(2)B站视频:本教程主要讲授针对 Java 开发所需的 MySQL 高级知识,课程中会让大家快速掌握索引,如何避免索引失效,索引的优化策略,了解innodb和myisam存储引擎,熟悉MySQL锁机制,能熟练配置MySQL主从复制,熟练掌握explain、show profile、慢查询日志等日常SQL诊断和性能分析策略。MySQL基础教程:https://www.bilibili.com/video/av21400736?spm_id_from=333.788.b_765f64657363.1。
对于人工而言,手写的SQL是这样的顺序:
对于MySQL数据库而言,它读取的顺序是这样的:
鱼骨图总结:
(1)班级表:
CREATE TABLE `RUN_Class` (
`Id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键ID(班级)',
`ClassName` varchar(256) NOT NULL COMMENT '班级名称',
`Status` tinyint(4) NOT NULL DEFAULT '1' COMMENT '有效=1,无效=-1',
`AddTime` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '添加时间',
`UpdateTime` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
PRIMARY KEY (`Id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COMMENT='班级信息表';
(2)学生表
CREATE TABLE `RUN_Student` (
`Id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键ID(学号)',
`Name` varchar(256) NOT NULL DEFAULT '' COMMENT '姓名',
`ClassId` int(11) NOT NULL COMMENT '班级',
`Status` tinyint(4) NOT NULL DEFAULT '1' COMMENT '有效=1,无效=-1',
`AddTime` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '添加时间',
`UpdateTime` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
PRIMARY KEY (`Id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COMMENT='学生信息表';
(1)内连接:内连接查询出的数据是两张表的交集,即图中红色所表示的部分。
(2)左外连接:左外连接如图中红色部分的内容,即包含左边表的全部行(不管右边的表中是否存在与它匹配的行),和右边表中全部匹配的行。
(3)右外链接:右外连接如图中红色部分的内容,即包含右边表的全部行(不管左边的表中是否存在与它匹配的行),和左边表中全部匹配行。
(4)左连接:左连接如图中红色部分的内容,查询出左表独有的数据。
解析:其实上图就是在左外连接的基础上进行的,左外连接得到了左表,但是左表里还包含了一部分左右表都具有相同数据的区域,这时需要将这部分相同数据去掉,去除的条件就是 B.key IS NULL。
(5)右连接:如果看懂了上面的左连接,那么右连接大同小异,就是查询出右表独有的数据。
解析:其实上图就是在右外连接的基础上进行的,右外连接得到了右表,但是右表里还包含了一部分左右表都具有相同数据的区域,这时需要将这部分相同数据去掉,去除的条件就是 A.key IS NULL。
(6)全连接(Mysql中不支持下图写法):查询出左右两表的所有数据 。
但是!MySQL中并不支持这种写法,所以只能通过别的方法。A、B的所有:也就是A的独有+B的独有+A与B的共同拥有的数据.
Mysql中可以使用:select * from Table A left join Table B on A.Key = B.Key (找出A的所有)
union (去重+合并)
select * from Table A right join Table B on A.Key = B.Key (找出B的所有)
(7)全外连接(Mysql中不支持下图写法):左右表的共有数据之外的数据查询。
筛选出对于A表而言B为空+对于B表而言A为空的数据,MySQL中也不支持这种写法,所以只能通过别的方法。
其实全外连接也就是:A的独有+B的独有。
Mysql语法: select * from Table A left join Table B on A.Key = B.Key where B.Key is null (找出A的独有)
union (去重)
select * from Table A right join Table B on A.Key = B.Key where A.Key is null (找出B的独有)
结论:索引一方面解决where条件的查询如何使其快速,另一方面解决order by排完序之后的查询如何使其快速。
表中数据达到几十万甚至数百万及行记录以上的时候才开始做优化比较合适。
explain关键字查询出10个字段属性:id、select_type、table、type、possiable_keys、key、key_len、ref、rows、extro
其中的type属性有如下7种取值:system > const > eq_ref > ref > range > index > all
注:先完成再完美,先功能再性能。