mysql的学习
资料来源 https://www.bilibili.com/video/BV1CZ4y1M7MQ?from=search&seid=3518646188262100291
三、存储过程和函数:【mysql】三、mysql的学习---存储过程和函数
四、触发器:【mysql】四、mysql的学习---触发器
五、存储引擎:【mysql】五、mysql的学习---存储引擎
六、SQL优化:【mysql】六、mysql的学习---SQL优化
七、应用优化:【mysql】七、mysql的学习---应用优化
八、查询缓存:【mysql】八、mysql的学习---查询缓存
九、内存优化:【mysql】九、mysql的学习---内存优化
十、Mysql并发参数调整和锁: 【mysql】十、mysql的学习---Mysql并发参数调整和锁
十一、常用的SQL技巧:【mysql】十一、mysql的学习---常用的sql技巧
本篇文章主要介绍 SQL优化 的相关知识
1. 查看sql执行效率
-- mysql客户端连接成功后,通过show [session|global] status 命令可以提供服务器状态信息。 -- show [session|global] status 可以根据需要加上参数session或者global来显示session级(当前连接)的计算结果和global级(自数据库上次启动至今)的统计结果。如果不写,默认使用参数是session。 -- Com_xxx表示每个xxx语句执行的次数,我们通常关心的是以下几个统计参数: -- 1. Com_select:执行select操作的次数,一次查询只累加1 -- 2. Com_insert:执行insert操作的次数,对于批量插入的insert操作,只累加一次 -- 3. Com_update:执行update操作的次数 -- 4. Com_delete:执行delete操作的次数 -- 5. Innodb_rows_read:select查询返回的行数 -- 查看SQL执行频率 默认为session (注意: _ 符号数量是7个) show status like 'Com_______' -- 查看SQL执行频率 全局的global show global status like 'Com_______'
-- 查看SQL执行频率查 Innodb的情况 show global status like 'Innodb_rows_%'
2 定位低效率执行sql
--可以通过以下两种方式定位执行效率较低的sql语句: --(1)慢查询日志:通过慢查询日志定位那些执行效率较低的sql语句,用--log-slow-queries[=file_name]选项启动时,mysqld写一个包含所有执行时间超过long_query_time秒的sql语句的日志文件。 --(2)show processlist:慢查询日志在查询结束以后才记录,所以在应用反映执行效率出现问题的时候查询慢查询日志并不能定位问题,可以使用show processlist命令查看当前mysql在进行的线程,包括线程的状态、是否锁表等,可以实时地查看sql的执行情况,同时对一些锁表操作进行优化。
-- 查看当前MySQL在进行的线程 show processlist
--查询连接ID select connection_id()
-- 这里我使用存储过程向user表中批量添加数据,可以看到执行show processlist;语句可以看出当前执行慢的具体sql。
-- 1. id列:用户登陆mysql时,系统分配的"connection_id",可以使用函数connection_id()查看 -- 2. user列:显示当前用户,如果不是root,这个命令就只显示用户权限范围的sql语句 -- 3. host列:显示这个语句是从哪个ip的哪个端口上发的,可以用来跟踪出现问题语句的用户 -- 4. db列:显示这个进行目前连接的是哪个数据库 -- 5. command列:显示当前连接的执行的命令,一般取值为休眠(sleep)、查询(query)、连接(connect)等 -- 6. time列:显示这个状态持续的时间,单位是秒 -- 7. state列:显示使用当前连接的sql语句的状态,很重要的列。state描述的是语句执行中的某一个状态。一个sql语句,以查询为例,可能需要经过copying to tmp table、sorting result、sending data等状态才可以完成。 -- 8. info列:显示这个sql语句,是判断问题语句的一个重要依据
3. explain分析执行计划
3.1 环境准备
-- 通过以上步骤查询到效率低的sql语句后,可以通过explain或者desc命令获取mysql如何执行select语句的信息,包括在select语句执行过程中表如何连接和连接的顺序。
create table t_role( id varchar(32) not null, role_name varchar(255) default null, role_code varchar(255) default null, description varchar(255) default null, primary key(id), unique key unique_role_name(role_name) )ENGINE=InnoDB default charset=utf8; create table t_user( id varchar(32) not null, username varchar(45) not null, password varchar(96) not null, name varchar(45) not null, primary key(id), unique key unique_user_username(username) )ENGINE=InnoDB default charset=utf8; create table user_role( id int(11) not null auto_increment, user_id varchar(32) not null, role_id varchar(32) not null, primary key(id), key fk_user_id(user_id), key fk_role_id(role_id), constraint fk_ur_role_id foreign key(role_id) references t_role(id) on DELETE NO ACTION on UPDATE NO ACTION, constraint fk_ur_user_id foreign key(user_id) references t_user(id) on DELETE NO ACTION on UPDATE NO ACTION )ENGINE=InnoDB default charset=utf8; insert into t_user(id,username,password,name) values(1,'super','6df93e89ee7c11ea8be9f875a471a574','超级管理员'); insert into t_user(id,username,password,name) values(2,'admin','6df93e89ee7c11ea8be9f875a471a574','系统管理员'); insert into t_user(id,username,password,name) values(3,'itcast','a3d8793cee7c11ea8be9f875a471a574','test02'); insert into t_user(id,username,password,name) values(4,'stu1','b8c1a8ffee7c11ea8be9f875a471a574','学生1'); insert into t_user(id,username,password,name) values(5,'stu2','c0cb5c46ee7c11ea8be9f875a471a574','学生2'); insert into t_user(id,username,password,name) values(6,'t1','c86cbf6cee7c11ea8be9f875a471a574','老师1'); insert into t_role(id,role_name,role_code,description) values(5,'学生','student','学生'); insert into t_role(id,role_name,role_code,description) values(7,'老师','teacher','老师'); insert into t_role(id,role_name,role_code,description) values(8,'教学管理员','teachmanager','教学管理员'); insert into t_role(id,role_name,role_code,description) values(9,'管理员','admin','管理员'); insert into t_role(id,role_name,role_code,description) values(10,'超级管理员','super','超级管理员'); insert into user_role(id,user_id,role_id) values(1,1,5); insert into user_role(id,user_id,role_id) values(2,1,7); insert into user_role(id,user_id,role_id) values(3,2,8); insert into user_role(id,user_id,role_id) values(4,3,9); insert into user_role(id,user_id,role_id) values(5,4,8); insert into user_role(id,user_id,role_id) values(6,5,10);