本节主要介绍查看SQL语句的效率,以及如何定位到运行慢的句子。

MySQL的优化方式有很多,大致我们可以从以下几点来优化MySQL:

  • 从设计上优化

  • 从查询上优化

  • 从索引上优化

  • 从存储上优化

查看SQL的执行频率

MySQL 客户端连接成功后,通过 show [session|global] status 命令可以查看服务器状态信息。

通过查看状态信息可以查看对当前数据库的主要操作类型

以代码附录里的句子为例,进行查询:

show session status like 'Com_______';  -- 查看当前会话统计结果
show global  status  like 'Com_______';  -- 查看自数据库上次启动至今统计结果 
show status like 'Innodb_rows_%’;       -- 查看针对Innodb引擎的统计结果

查看当前会话统计结果

参数的含义

定位低效率执行的SQL语句

  • 慢查询日志 : 通过慢查询日志定位那些执行效率较低的 SQL 语句。

  • show processlist:该命令查看当前MySQL在进行的线程,包括线程的状态、是否锁表等,可以实时地查看 SQL 的执行情况,同时对一些锁表操作进行优化。

慢日志查询

-- 查看慢日志配置信息 
show variables like '%slow_query_log%'; 

-- 开启慢日志查询 
set global slow_query_log=1; 

-- 查看慢日志记录SQL的最低阈值时间 
show variables like 'long_query_time%'; 

-- 修改慢日志记录SQL的最低阈值时间 
set global long_query_time=4;

show processlist语句

-- 通过show processlist来查看当前客户端连接服务器的线程执行
-- 这是一个实时查看的语句,可以新建个查询窗口来执行语句
show processlist;

运行结果

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语句,是判断问题语句的一个重要依据

代码附录

create database if not EXISTS mydb5;

use mydb5;

-- 创建表的时候添加全文索引
create table t_article (
     id int primary key auto_increment ,
     title varchar(255) ,
     content varchar(1000) ,
     writing_date date -- , 
     -- fulltext (content) -- 创建全文检索
);

-- 添加数据
insert into t_article values(null,"Yesterday Once More","When I was young I listen to the radio",'2021-10-01');
insert into t_article values(null,"Right Here Waiting","Oceans apart, day after day,and I slowly go insane",'2021-10-02'); 
insert into t_article values(null,"My Heart Will Go On","every night in my dreams,i see you, i feel you",'2021-10-03');
insert into t_article values(null,"Everything I Do","eLook into my eyes,You will see what you mean to me",'2021-10-04');
insert into t_article values(null,"Called To Say I Love You","say love you no new year's day, to celebrate",'2021-10-05');
insert into t_article values(null,"Nothing's Gonna Change My Love For You","if i had to live my life without you near me",'2021-10-06');
insert into t_article values(null,"Everybody","We're gonna bring the flavor show U how.",'2021-10-07');

-- 修改表结构添加全文索引
-- alter table t_article add fulltext index_content(content);
 
-- 直接添加全文索引
create fulltext index index_content on t_article(content);

-- 使用全文索引
-- 使用了两个关键字:match和against
select * from t_article where match(content) against('yo'); -- 没有结果 单词数需要大于等于3 
-- 在前面的支持情况里已经做了说明
-- 最小搜索长度、最大搜索长度
select * from t_article where match(content) against('you'); -- 有结果

声明:内容来源于B站视频《2022黑马程序员最新MySQL知识精讲+mysql实战案例_零基础mysql数据库入门到高级全套教程》,博客内容仅作学习参考使用。



博主个人公众号
版权声明 ▶ 本网站名称:陶小桃Blog
▶ 本文链接:https://www.52txr.cn/2022/mysql33.html
▶ 本网站的文章部分内容可能来源于网络,仅供大家学习与参考,如有侵权,请联系站长进行核实删除。
▶ 转载本站文章需要遵守:商业转载请联系站长,非商业转载请注明出处!!

最后修改:2022 年 06 月 15 日
如果觉得我的文章对你有用,请随意赞赏