本文正在参加「金石方案 . 分割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-…