MySQL⾼级--学习笔记(转·尚硅⾕周阳主讲)
1.MySQL安装(略)
2.MySQL逻辑架构
Connections:指的是不同语⾔中与SQL的交互。
Connection Pool:管理缓冲⽤户连接,线程处理等需要缓存的需求。MySQL数据库的连接层。
Enterprise Management Serveices & Utilities:系统管理和控制⼯具。备份、安全、复制、集等等。
数据库学什么SQL Interface:接受⽤户的SQL命令,并且返回⽤户需要查询的结果。
Parser:SQL语句解析器。
Optimizer:查询优化器,SQL语句在查询之前会使⽤查询优化器对查询进⾏优化。就是优化客户端请求query,根据客户端请求的query 语句,和数据库中的⼀些统计信息,在⼀系列算法的基础上进⾏分析,得出⼀个最优的策略,告诉后⾯的程序如何取得这个query 语句的结果。For Example: select uid,name from user where gender = 1;这个select查询先根据where语句进⾏选取,⽽不是先将表全部查询出来以后再进⾏gender过滤;然后根据uid和name进⾏属性投影,⽽不是将属性全部取出以后再进⾏过滤。最后将这两个查询条件联接起来⽣成最终查询结果。
Caches & Buffers:查询缓存。
Pluggable Storage Engines:存储引擎接⼝。MySQL区别于其他数据库的最重要的特点就是其插件式的表存储引擎(注意:存储引擎是基于表的,⽽不是数据库)。
File System:数据落地到磁盘上,就是⽂件的存储。
逻辑架构分层
MySQL数据库和其他数据库相⽐,MySQL有点与众不同,主要体现在存储引擎的架构上,插件式的存储引擎架构将查询处理和其他的系统任务以及数据的存储提取相分离。这种架构可以根据业务的需求和实际需求选择合适的存储引擎。
连接层:最上层是⼀些客户端和连接服务,包含本地sock通信和⼤多数基于客户端/服务端⼯具实现的类似于tcp/ip的通信。主要完成⼀些类似于连接处理、授权认证、及相关的安全⽅案。在该层上引⼊了线程池的概念,为通过认证安全接⼊的客户端提供线程。同样在该层上可以实现基于SSL的安全链接。服务器也会为安全接⼊的每个客户端验证它所具有的操作权限。
服务层:MySQL的核⼼服务功能层,该层是MySQL的核⼼,包括查询缓存,解析器,解析树,预处理器,查询优化器。主要进⾏查询解析、分析、查询缓存、内置函数、存储过程、触发器、视图等,select操作会先检查是否命中查询缓存,命中则直接返回缓存数据,否则解析查询并创建对应的解析树。
引擎层:存储引擎层,存储引擎真正的负责了MySQL中数据的存储和提取,服务器通过API与存储引擎进⾏通信。不同的存储引擎具有的功能不同,这样我们可以根据⾃⼰的实际需要进⾏选取。
存储层:数据存储层,主要是将数据存储在运⾏于裸设备的⽂件系统之上,并完成与存储引擎的交互。
3.存储引擎
show engines;命令查看MySQL5.7⽀持的存储引擎。
mysql> show engines;
`show variables like 'default_storage_engine%';`查看当前数据库正在使⽤的存储引擎。
mysql> show variables like 'default_storage_engine%';
+------------------------+--------+
| Variable_name | Value |
+------------------------+--------+
| default_storage_engine | InnoDB |
+------------------------+--------+
1 row in set (0.01 sec)
InnoDB和MyISAM对⽐
4.SQL性能下降的原因
查询语句写的差。
索引失效:索引建了,但是没有⽤上。
关联 查询太多join(设计缺陷或者不得已的需求)。
服务器调优以及各个参数的设置(缓冲、线程数等)。
5.SQL执⾏顺序
select # 5
...
from # 1
...
where # 2
...
group by # 3
...
having # 4
...
order by # 6
...
limit # 7
6.七种JOIN理论
// 1 左外连接
SELECT <select_list> FROM TableA A LEFT JOIN TableB B ON A.key = B.key;
// 2 右外连接
SELECT <select_list> FROM TableA A RIGHT JOIN TableB B ON A.key = B.key;
// 3 内连接
SELECT <select_list> FROM TableA A INNER JOIN TableB B ON A.key = B.key;
// 4 左外连接,除去公共部分
SELECT <select_list> FROM TableA A LEFT JOIN TableB B ON A.key = B.key WHERE B.key IS NULL;
// 5 右外连接,除去公共部分
SELECT <select_list> FROM TableA A RIGHT JOIN TableB B ON A.key = B.key WHERE A.key IS NULL;
// 6
SELECT <select_list> FROM TableA A FULL OUTER JOIN TableB B ON A.Key = B.Key;
/* MySQL不⽀持FULL OUTER JOIN这种语法可以改成 1+2 */
SELECT <select_list> FROM TableA A LEFT JOIN TableB B ON A.Key = B.Key
UNION
SELECT <select_list> FROM TableA A RIGHT JOIN TableB B ON A.Key = B.Key;
// 7
SELECT <select_list> FROM TableA A FULL OUTER JOIN TableB B ON A.Key = B.Key WHERE A.Key IS NULL OR B.Key IS NULL;
/* MySQL不⽀持FULL OUTER JOIN这种语法可以改成 4+5 */
SELECT <select_list> FROM TableA A LEFT JOIN TableB B ON A.Key = B.Key WHERE B.Key IS NULL;
UNION
SELECT <select_list> FROM TableA A RIGHT JOIN TableB B ON A.Key = B.Key WHERE A.Key IS NULL;
7.MySQL内连接(inner join)与外连接(outer join)
mySQL包含两种联接,分别是内连接(inner join)和外连接(out join),但我们⼜同时听说过左连接,交叉连接等术语,本⽂旨在总结这些术语之间的关系。
7.1内连接
⾸先说明内连接的⼀个重要性质:内连接查询结果与表的顺序⽆关(当然顺序可能会发⽣变化,但是对应关系绝对不会错乱)交叉连接(cross join)
当然,他还有其他的名字,⽐如:笛卡尔积,交叉积,还有最奇怪的名字“没有连接”(no join)
使⽤下列命令同时查询玩具表的toy列和男孩表的boy列,得到的结果就是交叉连接
,b.boy
FROM toys AS t
CROSS JOIN
boys AS b;
其中,CROSS JOIN可以省略,简写为
,b.boy2FROM toys AS t, boys AS b;
交叉连接回把第⼀张表的每个值与第⼆张表的每个值进⾏匹配,结果如下
相等连接
我们假设每个男孩⼦都⼜⼀个玩具,表之间是⼀对⼀的关系,toy_id是外键,数据库表如下图
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论