GreatSQL社区

搜索

[已解决] MYSQL 5.7 性能问题

564 1 2023-6-20 15:00
我的 MYSQL RDS FOR 5.7 遇到个性能问题
是这样的 数据库保留近6个月的业务数据, 超过6个月就会把6个月以前的数据迁移到历史表. 不过了基本上都是3-6个月迁移一次. 数据库保留接近10个月以上数据的时候, 查询近1-2个月,尤其是1个月的热数据, 比往日执行速度变慢.
比如说有个分页SQL:
  1. SELECT A.*
  2. FROM A LEFT JOING B
  3. WHERE A.REQUEST_TIME >=? AND A.REQUEST_TIME<='?'
  4. AND CHANNLE='?'
  5. AND PAY_TIME >='' AND PAY_TIME <='?'
  6. ORDER BY A.REQUEST_TIME DESC
  7. LIMIT 0,10;
复制代码

这样的SQL 要执行5秒, 查看执行计划 是 走的是 REQUEST_TIME索引,我试着 使用 PAY_TIME和CHANNEL 字段上的索引 执行耗时 300毫秒,OPTMIER TRACE 分析看 REQUEST_TIME 索引 成本高. 不过在附件条件下 考虑排序等因数 最后还是选择了REQUEST_TIME索引,该表 根据REQUEST_TIME进行周分区的.实际上返回的数据就1-2条,通过REQUEST_TIME 访问68万行数据,数据库是RDS FOR MYSQL 5.7 8核 16GB内存,研究来研究去 我怀疑上了 当数据累积一定程度, 内存或许不够用了, 而优化器就觉得排序内存成本高, 尽可能使用索引避免 FILE SORT,现在 就连 COUNT(*) 这种都要跑上7秒钟!

上面那段话 我意思是说, 如果我迁移走了6个月以前的数据,同样的SQL查询近1个月的数据,大多数是1,2秒. 随着时间慢慢过去,过了3-4个月,业务表就积累了9-10个月的数据, 而同样的SQL,也是查询近1个月的数据, 业务很平稳,每月就那么多数据,不增不减. 该SQL逐步变慢,有时候达到7秒

我使用OPTIMER TRACE 分析下 TABLE SACNE 142.5万 通过REQUEST_TIME 63.8万, 通过CHANNEL索引访问8.8万; 通过PAY_TIME索引访问6.3万.
执行计划分析中,选择是A为驱动 B为被驱动, A走PAY_TIME索引

在附加条件 加入分析情况下:
recchecking_index_useage
reason :"low_limit"
limit 10
row_estimate:17.587
在11个索引中,可选request_time索引
anlayzing_range_alternatives
  range_scan_alternatives
  index:"request_time"
index_dives_for_eq_ranges:true
rowid_ordered:false
using_mrr:false
index_only:false
rows:638300
cost:765961
chosen:true
后面
clase_processiong
reconsidering_access_paths_for_index_ordering
refine_plan
都出现REQUEST_TIME索引.
下面是引擎状态 BUFFER POOL
----------------------
BUFFER POOL AND MEMORY
----------------------
Total large memory allocated 9951510528
Dictionary memory allocated 10767115
Buffer pool size 589824
Free buffers 8193
Database pages 581631
Old database pages 214543
Modified db pages 7013
Pending reads 0
Pending writes: LRU 0, flush list 0, single page 0, flush chunk 0
Pages made young 10265058, not young 3336797273
0.00 youngs/s, 0.00 non-youngs/s
Pages read 29594405, created 15580206, written 59054014
0.00 reads/s, 0.00 creates/s, 0.00 writes/s
Buffer pool hit rate 1000 / 1000, young-making rate 0 / 1000 not 0 / 1000
Pages read ahead 0.00/s, evicted without access 0.00/s, Random read ahead 0.00/s
LRU len: 581631, unzip_LRU len: 0
I/O sum[5808]:cur[0], unzip sum[0]:cur[0]
----------------------
INDIVIDUAL BUFFER POOL INFO
----------------------
---BUFFER POOL 0
Buffer pool size 73728
Free buffers 1024
Database pages 72704
Old database pages 26818
Modified db pages 2809
Pending reads 0
Pending writes: LRU 0, flush list 0, single page 0, flush chunk 0
Pages made young 1359584, not young 411281312
0.00 youngs/s, 0.00 non-youngs/s
Pages read 3713064, created 1960072, written 7743258
0.00 reads/s, 0.00 creates/s, 0.00 writes/s
Buffer pool hit rate 1000 / 1000, young-making rate 0 / 1000 not 0 / 1000
Pages read ahead 0.00/s, evicted without access 0.00/s, Random read ahead 0.00/s
LRU len: 72704, unzip_LRU len: 0
I/O sum[726]:cur[0], unzip sum[0]:cur[0]
---BUFFER POOL 1

上次的跟踪文档:
MYSQL 5.7 RDS OPTIMER TRACE 优化问题
https://greatsql.cn/thread-364-1-1.html

全部回复(1)
yejr 2023-6-20 15:08:49
上次一样的问题,表DDL、统计信息、执行计划(可以EXPLAIN + EXPLAIN ANALYZE两种都尝试下)先贴出来吧
innerDBA

12

主题

0

博客

61

贡献

注册会员

Rank: 2

积分
92

助人为乐(铜)勤学好问(铜)

合作电话:010-64087828

社区邮箱:greatsql@greatdb.com

社区公众号
社区小助手
QQ群
GMT+8, 2024-5-21 20:56 , Processed in 0.015612 second(s), 9 queries , Redis On.
快速回复 返回顶部 返回列表