二、MySQL 高级部分

1-1、MySQL 简介
  • 1、概述
  • 2、MySQL 高级1、MySQL 内核优化2、sql 优化工程师3、MySQL 服务器的优化4、各种参数常量设定5、查询语句优化6、主从复制7、软硬件升级8、容灾备份9、sql 编程
1-2、MySQL Linux 版本的安装(yum 方式安装)

通过源代码 rpm 安装 mysqlyum 安装参考教程地址

  • 1、下载地址
  • 2、检查当前系统是否安装过 MySQL

yum list installed mysqlrpm -qa | grep mysql如果有卸载

  • 3、安装 MySQL 服务端

yum install mysql-serveryum install mysql-devel

  • 4、安装 MySQL 客户端

yum install mysql

  • 5、查看安装MySQL创建的 mysql 用户和用户组
  • 6、MySQL 服务的启动和停止

启动service mysqld start或者/etc/init.d/mysqld start停止service mysqld stop查看是否有mysql 进程在运行
ps -ef|grep mysql*

  • 7、mysql 服务启动后,开始连接

第一次登录修改用户密码:/usr/bin/mysqladmin -u root  password 'root'登录命令:
mysql -uroot -proot

  • 8、自启动mysql服务

1、将服务文件拷贝到init.d下,并重命名为mysqlcp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysqld2、赋予可执行权限
chmod +x /etc/init.d/mysqld
3、添加服务
chkconfig --add mysqld
4、显示服务列表
chkconfig --list
如果看到mysql的服务,并且3,4,5都是on的话则成功,如果是off,则键入
chkconfig --level 345 mysql on
5、重启电脑
reboot
6、验证
netstat -na | grep 3306
如果看到有监听说明服务启动了
chkconfig -add mysqld查看开机启动设置是否成功chkconfig --list | grep mysql*mysqld 0:关闭 1:关闭 2:启用 3:启用 4:启用 5:启用 6:关闭

  • 9、修改配置文件位置
  • 10、修改字符集和数据存储路径

mysql配置文件/etc/my.cnf中加入default-character-set=utf8

  • 11、MySQL 的安装位置
  1. 查看 mysql 服务进程的信息 


  2. ps -ef|grep mysql 



  3. --basedir /usr/bin 相关命令目录 mysqladmin mysqldump 等命令 


  4. --datadir/var/lib/mysql/ mysql 数据库文件的存放路径  


  5. --plugin-dir/usr/lib64/mysql/pluginmysql 插件存放路径 


  6. --log-error/var/lib/mysql/jack.atguigu.errmysql错误日志路径 


  7. --pid-file/var/lib/mysql/jack.atguigu.pid进程pid文件 


  8. --socket/var/lib/mysql/mysql.sock本地连接时用的unix套接字文件    


  9. /usr/share/mysql 配置文件目录 mysql 脚本及配置文件 

* * *
  1. /etc/init.d/mysql 服务启停相关脚本 
* * *

1-3、MySQL 配置文件

主要配置文件windows : my.ini 文件linux : my.cnf 文件 目录:/etc/my.cnf

  • 3-1、二进制日志 log-bin(log-bin 中存放了所有的操作记录(写?),可以用于恢复。相当于 Redis 中的 AOF    my.cnf-中的log-bin配置(默认关闭),主要用于主从复制,文件目录在my.cnf中配置)
  • 3-2、错误日志 log-erro(默认是关闭的,记录严重的警告和错误信息,每次启动和关闭的详细信息等, 文件目录在my.cnf中配置)
  • 3-3、查询日志 log( 默认关闭,记录查询的sql语句,如果开启会减低mysql的整体性能,因为记录日志也是需要消耗系统资源的)
  • 3-4、数据文件frm 文件:存放表结构myd 文件:存放表数据myi 文件:存放表索引存放目录:windows:D:\devSoft\MySQLServer5.5\data目录下可以挑选很多库linux:默认/var/lib/mysql
  • 3-5、如何配置
  • 3-6、MySQL 用户与权限管理

1、创建用户create user zwj identified by 'zwj';--表示创建名称为 zwj 的用户,密码设为 zwj;2、user 表使用
2-1、查看用户
select host,user,password,select_priv,insert_priv,drop_priv from mysql.user;
select * from user\G;--将 user 中的数据以行的形式显示出来(针对列很长的表可以采用这个方法 行转列显示)
2-2、修改当前用户的密码
set password =password('123456');
2-3、修改某个用户的密码
update mysql.user set password=password('123456') where user='li4';
flush privileges;   #所有通过user表的修改,必须用该命令才能生效
2-4、修改用户名
update mysql.user set user='li4' where user='wang5';
flush privileges;   #所有通过user表的修改,必须用该命令才能生效。
2-5、删除用户
drop user li4 ;#不要通过delete from  user u where user='li4' 进行删除,系统会有残留信息保留。
3、权限管理
3-1、授予权限,授权命令
grant 权限1,权限2... on 数据库名.表名 to 用户名@用户地址 identified by ‘连接口令’;
比如  
grant select,insert,delete,drop on atguigudb.* to li4@localhost  ;
 #给li4用户用本地命令行方式下,授予 atguigudb 这个库下的所有表的插删改查的权限。
grant all privileges on test.* to zwj@'%' identified by 'zwj'; 
#授予通过网络方式登录的的 zwj 用户 ,对所有库所有表的全部权限,密码设为 zwj.
#就算 all privileges 了所有权限,grant_priv 权限也只有 root 才能拥有。
给 root 赋连接口令 grant all privileges on . to root@'%'  ;后新建的连接没有密码,需要设置密码才能远程连接。
update user set password=password('root') where user='root' and host='%';
3-2、收回权限,授权命令
revoke  权限1,权限2,…权限n on 数据库名称.表名称  from  用户名@用户地址 ;
比如
REVOKE ALL PRIVILEGES ON mysql.* FROM joe@localhost;
#若赋的全库的表就 收回全库全表的所有权限
REVOKE select,insert,update,delete ON mysql.* FROM joe@localhost;
#收回 mysql 库下的所有表的插删改查权限,对比赋予权限的方法。必须用户重新登录后才能生效
3-3、查看权限命令
show grants;
#查看当前用户权限
select  * from user ;
#查看某用户的全局权限

select * from  db;
#查看某用户的某库的权限

select * from tables_priv;
#查看某用户的某个表的权限
4、通过远程工具访问数据库
4-1、先 ping 一下数据库服务器的 ip 地址确认网络畅通。
4-2、关闭数据库服务的防火墙
service iptables stop
4-3、 确认 Mysql 中已经有可以通过远程登录的账户
    select  * from mysql.user where user='li4' and host='%';
#如果没有用户,先执行如下命令:
    grant all privileges on .  to li4@'%'  identified by '123123';
4-4、测试连接

  • 3-7、MySQL 的一些杂项配置

1、大小写问题SHOW VARIABLES LIKE '%lower_case_table_names%' ;#windows系统默认大小写不敏感,但是linux系统是大小写敏感的;
#默认为0,大小写敏感,
#设置1,大小写不敏感。创建的表,数据库都是以小写形式存放在磁盘上,对于 sql 语句都是转换为小写对表和 DB 进行查找。
#设置2,创建的表和 DB 依据语句上格式存放,凡是查找都是转换为小写进行。
当想设置为大小写不敏感时,要在 my.cnf 这个配置文件 [mysqld] 中加入 lower_case_table_names = 1 ,然后重启服务器。
注意:要在重启数据库实例之前就需要将原来的数据库和表转换为小写,否则更改后将找不到数据库名。在进行数据库参数设置之前,需要掌握这个参数带来的影响,切不可盲目设置。

1-4、MySQL 逻辑架构介绍

逻辑架构总体概览和其它数据库相比,MySQL有点与众不同,它的架构可以在多种不同场景中应用并发挥良好作用。主要体现在存储引擎的架构上,插件式的存储引擎架构将查询处理和其它的系统任务以及数据的存储提取相分离。这种架构可以根据业务的需求和实际需要选择合适的存储引擎。1.连接层      最上层是一些客户端和连接服务,包含本地 sock 通信和大多数基于客户端/服务端工具实现的类似于 tcp/ip 的通信。主要完成一些类似于连接处理、授权认证、及相关的安全方案。在该层上引入了线程池的概念,为通过认证安全接入的客户端提供线程。同样在该层上可以实现基于 SSL 的安全链接。服务器也会为安全接入的每个客户端验证它所具有的操作权限。2.服务层       第二层架构主要完成大多少的核心服务功能,如 SQL 接口,并完成缓存的查询,SQL 的分析和优化及部分内置函数的执行。所有跨存储引擎的功能也在这一层实现,如过程、函数等。在该层,服务器会解析查询并创建相应的内部解析树,并对其完成相应的优化如确定查询表的顺序,是否利用索引等,最后生成相应的执行操作。如果是 select 语句,服务器还会查询内部的缓存。如果缓存空间足够大,这样在解决大量读操作的环境中能够很好的提升系统的性能。optimizer 是 sql 优化器。3.引擎层       存储引擎层,存储引擎真正的负责了 MySQL 中数据的存储和提取,服务器通过API与存储引擎进行通信。不同的存储引擎具有的功能不同,这样我们可以根据自己的实际需要进行选取。后面介绍 MyISAM 和 InnoDB4.存储层       数据存储层,主要是将数据存储在运行于裸设备的文件系统之上,并完成与存储引擎的交互。查询说明(MySQL 查询流程)首先,mysql 的查询流程大致是:

  • 1、mysql 客户端通过协议与 mysql 服务器建连接,发送查询语句,先检查查询缓存,如果命中(一模一样的sql才能命中),直接返回结果,否则进行语句解析,也就是说,在解析查询之前,服务器会先访问查询缓存(query cache)——它存储 SELECT 语句以及相应的查询结果集。如果某个查询结果已经位于缓存中,服务器就不会再对查询进行解析、优化、以及执行。它仅仅将缓存中的结果返回给用户即可,这将大大提高系统的性能。
  • 2、语法解析器和预处理:首先 mysql 通过关键字将 SQL 语句进行解析,并生成一颗对应的“解析树”。mysql 解析器将使用 mysql 语法规则验证和解析查询;预处理器则根据一些 mysql 规则进一步检查解析数是否合法。
  • 3、查询优化器当解析树被认为是合法的了,并且由优化器将其转化成执行计划。一条查询可以有很多种执行方式,最后都返回相同的结果。优化器的作用就是找到这其中最好的执行计划。
  • 4、然后,mysql 默认使用的 BTREE 索引,并且一个大致方向是:无论怎么折腾 sql,至少在目前来说,mysql 最多只用到表中的一个索引。
1-5、MySQL 存储引擎

1、查看存储引擎命令  #看你的 mysql 现在已提供什么存储引擎:
  mysql> show engines;

  #看你的 mysql 当前默认的存储引擎:
  mysql> show variables like '%storage_engine%';

2、MyISAM 和 InnoDB 对比
MyISAM 和 InnoDB 对比


二、索引优化分析(重点)

2-1、性能下降的原因
  • 性能:( SQL 慢、执行时间长、等待时间长)。

  • 原因:

  • 查询数据过多。

  • 关联了太多的表,太多 join 。

  • 没有利用到索引。

2-2、常见通用的 Join 查询
2-2-1、SQL 执行顺序

  1. # 人为书写 


  2. select <select_list> 



  3. from <left_table> join <right_table> 



  4. on <join_condition> 



  5. where <where_condition> 



  6. group by <group_by_list> 

* * *

  1. having <having_condition> 

* * *

  1. order by <order_by_condition> 

* * *

  1. limit <limit_number> 

* * *

  1. # 机器执行 

* * *
  1. FROM <LEFT_TABLE> JOIN <RIGHT_TABLE> 
* * *

  1. ON <JOIN_CONDITION> 

* * *

  1. WHERE <WHERE_CONDITION> 

* * *

  1. GROUP BY <GROUP_BY_LIST> 

* * *

  1. HAVING <HAVING_CONDITION> # 该关键字之后 再解析select 语句 

* * *

  1. SELECT DISTINCT <SELECT_LIST> 

* * *

  1. ORDER BY <ORDER_BY_CONDITION> 

* * *

  1. LIMIT <LIMIT_NUMBER> 

* * *


b16000d2588ce926ec7a4f276e3d7035.jpeg

2-2-2、常见通用的 join 查询


a3790215f529b8356fd8a8c14ae23c78.jpeg

2-2-3、建表 SQL

CREATE TABLE t_dept(id INT(11) NOT NULL AUTO_INCREMENT,deptName VARCHAR(30) DEFAULT NULL,address VARCHAR(40) DEFAULT NULL,PRIMARY KEY (id)) ENGINE=INNODB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8; CREATE TABLE t_emp(id INT(11) NOT NULL AUTO_INCREMENT,ename VARCHAR(20) DEFAULT NULL,age INT(3) DEFAULT NULL,deptId INT(11) DEFAULT NULL,PRIMARY KEY (id),KEY fk_dept_id (deptId)#CONSTRAINT 'fk_dept_id' FOREIGN KEY ('deptId') REFERENCES 't_dept' ('id')) ENGINE=INNODB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;   INSERT INTO t_dept(deptName,address) VALUES('华山','华山');INSERT INTO t_dept(deptName,address) VALUES('丐帮','洛阳');INSERT INTO t_dept(deptName,address) VALUES('峨眉','峨眉山');INSERT INTO t_dept(deptName,address) VALUES('武当','武当山');INSERT INTO t_dept(deptName,address) VALUES('明教','光明顶');INSERT INTO t_dept(deptName,address) VALUES('少林','少林寺');INSERT INTO t_emp(ename,age,deptId) VALUES('风清扬',90,1);INSERT INTO t_emp(ename,age,deptId) VALUES('岳不群',50,1);INSERT INTO t_emp(ename,age,deptId) VALUES('令狐冲',24,1);INSERT INTO t_emp(ename,age,deptId) VALUES('洪七公',70,2);INSERT INTO t_emp(ename,age,deptId) VALUES('乔峰',35,2);INSERT INTO t_emp(ename,age,deptId) VALUES('灭绝师太',70,3);INSERT INTO t_emp(ename,age,deptId) VALUES('周芷若',20,3);INSERT INTO t_emp(ename,age,deptId) VALUES('张三丰',100,4);INSERT INTO t_emp(ename,age,deptId) VALUES('张无忌',25,5);INSERT INTO t_emp(ename,age,deptId) VALUES('韦小宝',18,null); 

2-3、索引简介
2-3-1、什么是索引?
  • 1、MySQL官方对索引的定义为:索引(Index)是帮助 MySQL高效获取数据的数据结构。可以得到索引的本质:索引是数据结构。
  • 2、可以简单理解为“排好序的快速查找数据结构”。
  • 3、一般来说索引本身也很大,不可能全部存储在内存中,因此索引往往以索引文件的形式存储的磁盘上。
  • 4、我们平常所说的索引,如果没有特别指明,都是指 B 树(多路搜索树,并不一定是二叉的)结构组织的索引。其中聚集索引,次要索引,覆盖索引,复合索引,前缀索引,唯一索引默认都是使用 B+ 树索引,统称索引。当然,除了 B+ 树这种类型的索引之外,还有哈稀索引(hash index) 等。

总结:索引功能(排序+查询),给记录建立顺序用于查询。

2-3-2、索引的优点与缺点
  • 1、优点:

  • 类似大学图书馆建书目索引,提高数据检索的效率,降低数据库的 IO 成本。

  • 通过索引列对数据进行排序,降低数据排序的成本,降低了 CPU 的消耗。

  • 2、缺点

  • 虽然索引大大提高了查询速度,同时却会降低更新表的速度,如对表进行 INSERT、UPDATE 和 DELETE。因为更新表时,MySQL 不仅要保存数据,还要保存一下索引文件每次更新添加了索引列的字段,都会调整因为更新所带来的键值变化后的索引信息。

  • 索引只是提高效率的一个因素,如果 MySQL 有大数据量的表,就需要花时间研究建立最优秀的索引,或优化查询语句。

2-3-3、MySQL 索引分类

主键索引、唯一索引、单值索引、复核索引四大类。1、主键索引(设定为主键后数据库会自动建立索引,innodb 为聚簇索引)。语法如下:随表一起建索引:CREATE TABLE customer (id INT(10) UNSIGNED  AUTO_INCREMENT ,customer_no VARCHAR(200),customer_name VARCHAR(200),  PRIMARY KEY(id) );unsigned (无符号的)使用 AUTO_INCREMENT 关键字的列必须有索引(只要有索引就行)。CREATE TABLE customer2 (
id INT(10) UNSIGNED   ,
customer_no VARCHAR(200),
customer_name VARCHAR(200),
  PRIMARY KEY(id) 
);
单独建主键索引:
ALTER TABLE customer 
 add PRIMARY KEY customer(customer_no);  

删除建主键索引:
ALTER TABLE customer 
 drop PRIMARY KEY ;  

修改建主键索引:
必须先删除掉(drop)原索引,再新建(add)索引2、唯一索引(索引的列的值必须唯一,允许有空值)。语法如下:随表一起建索引:CREATE TABLE customer (id INT(10) UNSIGNED  AUTO_INCREMENT ,customer_no VARCHAR(200),customer_name VARCHAR(200),PRIMARY KEY(id),KEY (customer_name),UNIQUE (customer_no));建立 唯一索引时必须保证所有的值是唯一的(除了null),若有重复数据,会报错。  单独建唯一索引:
CREATE UNIQUE INDEX idx_customer_no ON customer(customer_no); 

删除索引:
DROP INDEX idx_customer_no on customer ;3、单值索引(即一个索引只包含单个列,一个表可以有多个单列索引)。语法如下:随表一起建索引:CREATE TABLE customer (id INT(10) UNSIGNED  AUTO_INCREMENT ,customer_no VARCHAR(200),customer_name VARCHAR(200),PRIMARY KEY(id),KEY (customer_name)  );随表一起建立的索引,索引名同列名(customer_name)单独建单值索引:
CREATE  INDEX idx_customer_name ON customer(customer_name); 

删除索引:
DROP INDEX idx_customer_name ;4、复合索引(即一个索引包含多个列)。语法如下:随表一起建索引:CREATE TABLE customer (id INT(10) UNSIGNED  AUTO_INCREMENT ,customer_no VARCHAR(200),customer_name VARCHAR(200),PRIMARY KEY(id),KEY (customer_name),UNIQUE (customer_name),KEY (customer_no,customer_name)); 单独建索引:CREATE  INDEX idx_no_name ON customer(customer_no,customer_name);  删除索引:DROP INDEX idx_no_name  on customer ;

2-3-4、MySQL 索引结构

1、BTree 索引

【初始化介绍】 一颗b树,浅蓝色的块我们称之为一个磁盘块,可以看到每个磁盘块包含几个数据项(深蓝色所示)和指针(黄色所示),如磁盘块1包含数据项17和35,包含指针P1、P2、P3,P1表示小于17的磁盘块,P2表示在17和35之间的磁盘块,P3表示大于35的磁盘块。真实的数据存在于叶子节点即3、5、9、10、13、15、28、29、36、60、75、79、90、99。非叶子节点不存储真实的数据,只存储指引搜索方向的数据项,如17、35并不真实存在于数据表中。

【查找过程】如果要查找数据项29,那么首先会把磁盘块1由磁盘加载到内存,此时发生一次IO,在内存中用二分查找确定29在17和35之间,锁定磁盘块1的P2指针,内存时间因为非常短(相比磁盘的IO)可以忽略不计,通过磁盘块1的P2指针的磁盘地址把磁盘块3由磁盘加载到内存,发生第二次IO,29在26和30之间,锁定磁盘块3的P2指针,通过指针加载磁盘块8到内存,发生第三次IO,同时内存中做二分查找找到29,结束查询,总计三次IO。

真实的情况是,3层的b+树可以表示上百万的数据,如果上百万的数据查找只需要三次IO,性能提高将是巨大的,如果没有索引,每个数据项都要发生一次IO,那么总共需要百万次的IO,显然成本非常非常高。

2、B+Tree 索引3、聚簇索引与非聚簇索引4、full-text 全文索引5、Hash 索引6、R-Tree 索引

2-4、性能分析
2-4-1、MySQL Query Optimizer(查询优化器)

查询优化器

1、MySQL 中有专门负责优化 SELECT 语句的优化器模块,主要功能:通过计算分析系统中收集到的统计信息,为客户端请求的 Query 提供他认为最优的执行计划。(他认为最优的数据检索方式,但不见得是 DBA 认为是最优的,这部分最耗贵时间)。

2、当客户端向 MYSQL 请求一条 Query,命令解析器模块完成请求分类,区别出是 SELECT 并转发给 MYSQL Query Optimizer 时, MYSQL Query Optimizer 首先会对整条 Query 进行优化,处理掉一些常量表达式的预算,直接换算成常量值。并对 Query 中的查询条件进行简化和转换,如去掉一些无用或显而易见的条件、结构调整等。然后分析 Query 中的 Hint 信息(如果有),看显示 Hint 信息是否可以完全确定该 Query 的执行计划。如果没有 Hint 或 Hint 信息还不足以完全确定执行计划,则会读取所涉及对象的统计信息,根据 Query 进行写相应的计算分析,然后再得出最后的执行计划。

2-4-2、MySQL常见瓶颈

1、【CPU】CPU 在饱和的时候一般发生在数据装入内存或从磁盘上读取数据时候。

2、【IO】磁盘 IO 瓶颈发生在装入数据远大于内存容量的时候。

3、【锁】不适宜的锁的设置,导致线程阻塞,性能下降。死锁,线程之间交叉调用资源,导致死锁,程序卡住。

4、【服务器硬件的性能瓶颈】可通过 top,free, iostat 和 vmstat 来查看系统的性能状态。如何使用?

2-4-3、Explain(重要)

【1、什么是执行计划?】使用 EXPLAIN 关键字可以模拟优化器执行 SQL 查询语句,从而知道 MySQL 是如何处理你的 SQL 语句的。分析你的查询语句或是表结构的性能瓶颈。explain+sql 横向展示explain+sql\G 竖向展示

【2、执行计划的作用】查看表的读取顺序。(通过列 id、select_type)。数据读取操作的操作类型(通过列 Type)。哪些索引可以使用(通过列 possible_keys)。哪些索引被实际使用(通过列 keys)。表之间的引用。每张表有多少行被优化器查询(通过列 rows)

【3、执行计划包含的信息】主要学习以下 10 种类型表达的含义及使用。

| ID | Select_type | table | type | possible_keys | key | key_len | ref | rows | extra |
| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- |
|
|

【4、10种类型的含义及使用详解】

测试 10 种类型代表的含义--建表语句CREATE TABLE t1(id INT(10) AUTO_INCREMENT,content VARCHAR(100) NULL ,PRIMARY KEY (id));CREATE TABLE t2(id INT(10) AUTO_INCREMENT,content VARCHAR(100) NULL ,PRIMARY KEY (id));CREATE TABLE t3(id INT(10) AUTO_INCREMENT,content VARCHAR(100) NULL ,PRIMARY KEY (id));CREATE TABLE t4(id INT(10) AUTO_INCREMENT,content VARCHAR(100) NULL ,PRIMARY KEY (id));  INSERT INTO t1(content) VALUES(CONCAT('t1_',FLOOR(1+RAND()*1000)));INSERT INTO t2(content) VALUES(CONCAT('t2_',FLOOR(1+RAND()*1000)));INSERT INTO t3(content) VALUES(CONCAT('t3_',FLOOR(1+RAND()*1000)));INSERT INTO t4(content) VALUES(CONCAT('t4_',FLOOR(1+RAND()*1000)));

  • 1、【ID 字段 重要】

id 相同,执行顺序由上至下。id 不同,如果是子查询,id 的序号会递增,id值越大优先级越高,越先被执行。id 相同不同,同时存在。(id 如果相同,可以认为是一组,从上往下顺序执行;在所有组中,id值越大,优先级越高,越先执行)。


19cadf1dbf9e96726036cea181d66546.jpeg

  • 2、【select_type 字段】:查询类型字段,主要用来区别是普通查询、联合查询和复杂查询。

SIMPLE:简单的 select 查询,查询中不包含子查询或者 UNION。PRIMARY:查询中若包含任何复杂的子部分,最外层查询则被标记为 Primary。DERIVED:在 FROM 列表中包含的子查询被标记为 DERIVED(衍生),MySQL 会递归执行这些子查询, 把结果放在临时表里。DERIVED 既查询通过子查询查出来的临时表。SUBQUERY:在 SELECT 或 WHERE 列表中包含了子查询。查询结果为 单值 DEPENDENT SUBQUERY:在 SELECT 或 WHERE 列表中包含了子查询,子查询基于外层。子查询结果为 多值UNCACHEABLE SUBQUREY:无法被缓存的子查询。UNION:若第二个 SELECT 出现在 UNION 之后,则被标记为UNION;若UNION包含在 FROM 子句的子查询中,外层 SELECT 将被标记为:DERIVED。UNION RESULT:从 UNION 表获取结果的 SELECT。

  • 3、【Table 字段】:显示这一行的数据是关于哪张表的。
  • 4、【Type 字段 重要】:显示访问类型。

结果值从好到坏:system>const>eq_ref>ref>range>index>ALL一般来说,得保证查询至少达到 range 级别,最好能达到 ref。优化过程主要减少 All 类型的出现,避免全表扫描。

  • 5、【possible_keys 字段】:显示理论上需要使用的索引。

查询涉及到的字段上若存在索引,则该索引将被列出,但不一定被查询实际使用。

  • 6、【key 字段】:显示实际使用的索引,null 表示没有使用索引。

查询中若使用了覆盖索引,则该索引和查询的 select 字段重叠。覆盖索引:查询的列和所建的复核索引列一致。

  • 7、【key_len 字段】:显示值表示索引中使用的字节数,索引的长度,越短越好(查询时使用的长度越小越好)。

key_len 字段能够帮你检查是否充分的利用上了索引。

  • 8、【ref 字段】:显示索引的哪一列被使用了,如果可能的话,是一个常数。哪些列或常量被用于查找索引列上的值。
  • 9、【rows 字段】:显示 MySQL 认为它执行查询时必须检查的行数。(越少越好)

即根据表统计信息及索引选用情况,大致估算出找到所需的记录需要读取的行数。

  • 10、【Extra 字段 重要】:显示不适合在其他列中显示但十分重要的额外信息。

Using filesort :说明 MySQL 会对数据使用一个外部的索引排序,而不是按照表内的索引顺序进行读取。MySQL 中无法利用索引完成的排序操作称为“文件排序”。(优化后不应该有)Using temporary :使了用临时表保存中间结果,MySQL在对查询结果排序时使用临时表。常见于排序 order by 和分组查询 group by。(优化后不应该有)Using index:表示相应的select操作中使用了覆盖索引(Covering Index),避免访问了表的数据行,效率不错!;如果同时出现using where,表明索引被用来执行索引键值的查找;如果没有同时出现using where,表明索引只是用来读取数据而非利用索引执行查找。Using where:表明使用了where过滤using join buffer:使用了连接缓存:impossible where:where 子句的值总是 false,不能用来获取任何元组select tables optimized away:在没有GROUPBY子句的情况下,基于索引优化MIN/MAX操作或者对于MyISAM存储引擎优化COUNT(*)操作,不必等到执行阶段再进行计算,查询执行计划生成的阶段即完成优化。


三、查询截取分析

3-1、查询优化
3-1-1、使用索引进行优化
3-1-2、单表查询优化
3-1-3、关联查询优化
3-1-4、子查询优化
3-1-5、order by 关键字优化
3-1-6、分页查询优化
3-1-7、Group by 关键字优化
3-1-8、去重优化
慢查询日志
批量数据脚本
show profile
全局查询日志

四、MySQL 锁机制

概述
三锁

表锁行锁页锁


五、主从复制

复制的基本原理
复制的基本原则
复制的最大问题
一主一从常见配置
posted @ 2021-08-21 20:40  星命定轨  阅读(48)  评论(0编辑  收藏  举报