我的 MYSQL RDS FOR 5.7 遇到个性能问题 是这样的 数据库保留近6个月的业务数据, 超过6个月就会把6个月以前的数据迁移到历史表. 不过了基本上都是3-6个月迁移一次. 数据库保留接近10个月以上数据的时候, 查询近1-2个月,尤其是1个月的热数据, 比往日执行速度变慢. 比如说有个分页SQL:
这样的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 |
合作电话:010-64087828
社区邮箱:greatsql@greatdb.com