本文正在参加「金石方案 . 分割6万现金大奖」

大家好,我是 那个从前的少年回来了。10年前我也从前年青过,如今已步入被筛选的年纪,但现在幡然醒悟,所以活在当下,每天努力一点点,来看看2024年的时分自己会是什么样子吧,2024年的前端又会是什么样子,而2024年的我国乃至全球又会变成什么样子,假如你也有主意,那还不赶忙行动起来。等待是美好的,可是更重要的是要为美好而为之斗争付诸于行动。

1、前语

最近对mysql的操作比较多一些,主要是项目上线今后,不免会有一些数据上的问题。开端的时分还主要由后端来处理,后边数据问题的确比较多,所以我就找后端要来服务器的账号密码,连上数据库顺便来看看数据的问题。

项目上线后我是如何通过慢查询和索引让系统快起来的

周五运用人数达到了高峰,总共有5300人在运用,今天截图的时分是周六人数略有削减。

项目上线后我是如何通过慢查询和索引让系统快起来的

这是三个表数据比较大的表,目前大致运行两周的时刻就现已很大了。

项目上线后我是如何通过慢查询和索引让系统快起来的

这是数据量最多的一张表,大致现已410W条记载了。

算是一个小小的系统,不算大,可是从目前数据量的增加来看,慢慢的数据量或许会越来越大。

2、mysql 索引

最开端项目刚上线的时分,由于没有数据,所以根本没什么感觉,突然某一天,就感觉到接口的响应时刻显着的变慢了。但其实后端并没有什么线上的经验,所以我借机就要来了服务器的账号密码。基本上除了主键以外,没有加任何的索引。打到数据库上的查询就实打实的有一些慢了,(虽然这儿运用了一主四从),四个从库相当于都是用来做查询运用的,可是在没有索引的状况下,真的有点慢了。我跟后端稍作沟通,我就准备直接在正式环境增加数据库表的索引了。

这是平常小程序里接口的回来时刻记载。并且有时分依据拜访人数的不同,偶尔有时分会到三秒到四秒。

项目上线后我是如何通过慢查询和索引让系统快起来的

3、翻开慢查询记载开关

那么能否经过专业的东西去检查呢?首先我做的第一件事情就是,检查一下mysql的慢查询是否有翻开,好家伙,还不错,竟然翻开了。假如没敞开能够敞开一下:

// 检查慢查询日志是否敞开  on为敞开  off为封闭 默许是封闭的
show variables like 'slow_query_log';
// 设置是否敞开慢查询日期记载
set global slow_query_log = on;    #敞开
set global slow_query_log = off;   #封闭
// 检查慢查询的阈值(默许是10秒)
show variables like 'long_query_time';
// 假如想修改慢查询的阈值
// 阈值设置为1秒
set global long_query_time = 1;   
// 检查慢查询日志文件路径
show variables like 'slow_query_log_file';

假如慢查询记载log没有翻开,能够参阅一下这篇文章:/post/716761…

4、经过mysqldumpslow 查询慢查询sql

下面是常用的几个查询慢SQL的脚本语句

// 得到回来记载集最多的10条SQL:
mysqldumpslow -s r -t  10 /var/lib/mysql/slow.log
// 得到拜访次数最多的10条SQL:
mysqldumpslow -s r -t  10 /data/mysql/slow.log
// 得到依照时刻排序的前10条里面含有左衔接的SQL:
mysqldumpslow -s t -t 100 -g "left join" /var/lib/mysql/slow.log
// 也支持管道符命令
mysqldumpslow -s t -t 10 -g "left join" /var/lib/mysql/slow.log | more //分页显现

履行后成果如下所示,一目了然

项目上线后我是如何通过慢查询和索引让系统快起来的

能够检查到第一个sql 均匀耗时2.94s,这个sql不管在哪里运用都会感觉慢了。所以这个时分检查sql今后,能够运用explain + sql 在mysql客户端履行,检查履行方案

项目上线后我是如何通过慢查询和索引让系统快起来的

能够检查回来成果,我平常观察最多的几个字段就是 type、 rows、Extra、等字段。

假如你想详细了解 explain的履行方案,你能够拜访如下链接来重点阅览: /post/716359…

5、直接增加索引

我简略能够总结为如下:

  • 1、join 后看表相关的字段

  • 2、where 后看查询条件的字段

  • 3、group by order by 后的 分组条件和排序条件

在有条件的时分,上述地方能加索引就加索引,可是一般一张表增加五个索引就算比较多的,由于假如一张表索引过多在其他地方,比方存储、增加、删去的时分都会从头整理索引,成本消耗会很大。

项目上线后我是如何通过慢查询和索引让系统快起来的

目前来说这种简略粗犷的方法,在几百万数据的量级彻底解决了我的问题,这儿展现了我随便找的一张表,里面增加了四个索引,这儿彻底能够用四个字段的普通索引即可,我这儿其时为了验证联合索引或许叫复合索引就没改了,目前来看效果还是嘎嘎的香,随着数据量的增加我猜测索引会有调整。

6、重置慢查询日志

假如咱们优化完毕了,正式环境从头部署了,咱们想检查一下效果,比方想去查询一下慢查询的日志记载,可是之前的日志记载还在,这个时分咱们应该怎么办呢?

// 经过rm直接删去慢查询日志记载文件
rm slow.log
// 然后记得要重置慢查询才会敞开继续登录
// 在 mysql地点的linux服务器上履行
mysqladmin -uroot -p flush-logs slow
//或许在mysql数据库中履行
mysql> FLUSH LOGS;

重置后可检查slow.log是否从头生成。

7、注意事项

  • 尽量制止运用 select * 进行查询:削减IO和传递压力等

  • 查询条件的类型尽量与数据库里的类型一致:不一致或许导致索引失效

  • group by 后假如不想排序 能够在后边增加order by null

  • 查询方案中尽量防止全表扫描

  • 每张表都要设置主键,由于不设置mysql会自动帮咱们设置

  • 主键最好不要用GUID,尽量自增ID(GUID刺进时时无序的)

  • 清晰只回来一条记载的sql 能够加上limit 1

  • 联合索引(复合索引)查询时要注意查询字段的次序

  • 假如能够尽量给字段设置默许值,不要为null空值,null在一定程度上会形成索引失效

  • like 模糊查询尽量不要以% 开头,由于会形成索引失效

  • 一个sql相关的表不要过多(一般最多三到五个)

  • 多表查询时一定先以小表查询,再来查询大表,也就是小表驱动大表

  • 尽量少用or会形成索引失效,有些时分能够运用union all替换

  • 当然还有其他的,暂时在项目运用就这么多

8、总结

一种状况时找到具体接口中运用的sql,假如很慢进行优化sql或许增加索引,另外一种时经过mysql东西查找到记载的慢查询sql,能够直接依据表结构进行增加索引,假如很复杂,并且简略的增加索引无法提速,或许要依据具体事务进行分析调整再增加索引。总归索引的运用在大部分状况下是非常有用的。 经过explain 检查sql履行方案,进行优化索引和表规划,由于在某些状况合理的表结构默许值设置、或许表相关字段设置,都能有用的防止全表扫描。 总归不要怂,加错了索引,大不了花点时刻删去就好了。

我的个人博客:vue.tuokecat.com/blog

我的个人github:github.com/aehyok

我的前端项目:pnpm + monorepo + qiankun + vue3 + vite3 + 东西库、组件库 + 工程化 + 自动化
不断完善中,全体结构都有了
在线预览:vue.tuokecat.com
github源码:github.com/aehyok/vue-…