如何对 mysql 进行优化的问题

2020-12-29 08:46:57 +08:00
 lopetver

如下图,mysql 慢日志记录到的查询语句,目前 mysql 的 CPU 使用率达 70%左右

目前这个 d_lampblack_real_time 表中有 2000W 行的数据,请教下各位大佬该如何优化下。

3710 次点击
所在节点    MySQL
41 条回复
x66
2020-12-29 10:05:23 +08:00
全表扫描了,给 monitor_time 加个索引,查询的时候再给时间字符串外面包一个 str_to_date('2020-12-21 15:15:00',’%Y-%m-%d %H:%i:%s’)
ETO
2020-12-29 10:05:40 +08:00
@lijialong1313 我们以前项目也是这么用的,为了加 and 条件方便,直接无脑拼接 SQL,而且这个对会被优化器优化掉的吧,应该。
pabupa
2020-12-29 10:06:26 +08:00
flink 吧,做统计的话。
或者 canal 自己算。
只用 mysql 的话,再怎么优化也就那样啊。
securityCoding
2020-12-29 10:06:46 +08:00
@lopetver 拿你的业务 sql 执行计划
sidong1993
2020-12-29 10:07:02 +08:00
@lopetver 发你有问题的 sql 语句的执行计划啊。你发的 select * from d_lampblack_real_time,这个语句执行计划又看不出啥
ymz
2020-12-29 10:07:45 +08:00
1 = 1 会被优化
lopetver
2020-12-29 10:13:05 +08:00
@ymz 好的,这边优化下吧
@x66 收到,感谢
@sidong1993 OK,我再执行下业务的 sql 语句
SjwNo1
2020-12-29 10:14:05 +08:00
什么版本的 mysql, explain 显示没索引。。
lopetver
2020-12-29 10:16:21 +08:00
@SjwNo1 mysql5.7.31 的
@sidong1993 已添加到附言
ymz
2020-12-29 10:35:21 +08:00
lampblack_01 这个联合索引会不会有点太大,type=index,是二级索引全表扫描,难道你那么多查询字段都在联合索引里?
securityCoding
2020-12-29 10:38:29 +08:00
啰嗦一下 ,我提个小建议,v2 这里对于解决问题都是比较热情的,前提是希望你能清晰描述你的问题 , 如果我提类似问题的时候我会这样准备问题资料
1. mysql 版本
2. 业务表的 ddl ,以及数据量
3. 业务 sql 以及执行计划
lopetver
2020-12-29 10:41:52 +08:00
@ymz 业务上的事情我也不清楚呢,谢谢了。
@securityCoding 嗯嗯,感谢感谢,是我准备的不全面了,下次我注意
junan0708
2020-12-29 10:57:08 +08:00
rows_examined 27379421 扫描的记录数
sidong1993
2020-12-29 14:40:42 +08:00
感觉是全表扫了,lampblock_01 索引包含了哪些列,时间加个索引?然后考虑考虑一些数据处理流程放在应用里去做?
mingszu
2020-12-29 14:43:08 +08:00
@lopetver 能看看 lampblack_01 的索引信息吗? show index from d_lampblack_real_time
lopetver
2020-12-29 14:59:53 +08:00
@mingszu

+-----------------------+------------+--------------+--------------+----------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment |
+-----------------------+------------+--------------+--------------+----------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| d_lampblack_real_time | 0 | PRIMARY | 1 | id | A | 0 | NULL | NULL | | BTREE | | |
| d_lampblack_real_time | 0 | lampblack_01 | 1 | equipment_code | A | 0 | NULL | NULL | | BTREE | | |
| d_lampblack_real_time | 0 | lampblack_01 | 2 | monitor_time | A | 0 | NULL | NULL | | BTREE | | |
| d_lampblack_real_time | 1 | lampblack_02 | 1 | fs | A | 0 | NULL | NULL | YES | BTREE | | |
| d_lampblack_real_time | 1 | lampblack_02 | 2 | ps | A | 0 | NULL | NULL | YES | BTREE | | |
+-----------------------+------------+--------------+--------------+----------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
5 rows in set (0.00 sec)

现在已经把这个业务停了,应该看不出来原因了。回头再用了,这边再看下吧
ymz
2020-12-29 15:38:50 +08:00
@mingszu lampblack_01 这个联合索引只有两个字段,执行计划的 type 怎么会是 index,大佬知道为什么么?
sampeng
2020-12-29 18:25:01 +08:00
哎…你就一个 where 条件。加索引优化是多难?现在写代码这么难了么?

另外如果你是 5.7 以前的版本,时间加索引没什么用。5.7 以后有倒排索引。这是其一。
其二,group 用程序实现…4000 万数据集还让 mysql 干这么重的事昂?
taogen
2020-12-29 19:48:01 +08:00
同楼上,where 加索引,group 在程序中做。
vindurriel
2020-12-29 20:18:23 +08:00
索引是(code, time) ,查询是 1. range of time, 2. group by code
建议把索引调换一下顺序试试(time, code)

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/739820

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX