目前系统的 Stat 表以每天 20W 条的数据量增加,尽管已经把超过3个月的数据 dump 到其他地方,但表中仍然有接近 2KW 条数据,容量接近 2GB。

Stat 表已经加上索引,直接 select … where … limit 的话,速度还是很快的,但一旦涉及到 group by 分页,就会变得很慢。

据观察,7天内的 group by 需要 35~50s 左右。运营反映体验极其不友好。
于是上网搜索 MySQL 分区方案。发现网上的基本上都是在系统性地讲解 partition 的概念和种类,以及一些实验性质的效果,并不贴近实战。

通过参考 MySQL手册以及自己的摸索,最终在当前系统中实现了分区,因为记录一下。

分区类型的选择

Stat 表本身是一个统计报表,所以它的数据都是按日期来存放的,并且热数据一般只限于当天,以及7天内。所以我选择了 Range 类型来进行分区。

为当前表创建分区

因为是对已有表进行改造,所以只能用 alter 的方式:

ALTER TABLE statPARTITION BY RANGE(TO_DAYS(dt)) (PARTITION p0 VALUES LESS THAN(0),PARTITION p190214 VALUES LESS THAN(TO_DAYS('2019-02-14')),PARTITION pm VALUES LESS THAN(MAXVALUE));

这里有2点要注意:

一是 p0 分区,这是因为 MySQL(我是5.7版) 有个 bug,就是不管你查的数据在哪个区,它都会扫一下第一个区,我们每个区的数据都有几十万条,扫一下很是肉疼啊,所以为了避免不必要的扫描,直接弄个0数据分区就行了。

二是 pm 分区,这个是最大分区。假如不要 pm,那你存 2019-02-15 的数据就会报错。所以 pm 实际上是给未来的数据一个预留的分区。

定期扩展分区

由于 MySQL 的分区并不能自己动态扩容,所以我们要写个代码为它动态的增加分区。

增加分区需要用到 REORGANIZE 命令,它的作用是对某个分区重新分配。
比如明天是 15 号,那我们要给 15 号也增加个分区,实际上就是把 pm 分区拆分成2个分区:

ALTER TABLE statREORGANIZE PARTITION pm INTO (PARTITION p190215 VALUES LESS THAN(TO_DAYS('2019-02-15')),PARTITION pm VALUES LESS THAN(MAXVALUE));

这里就涉及到一个问题,即如何获得当前表的所有分区?网上有挺多方法,但我试了下感觉还是先 show create table stat 然后用正则匹配出所有分区更方便一点。

定期删除分区

随着数据库越来越大,我们肯定是要清除旧的数据,同时也要清除旧的分区。
这个也比较简单:

ALTER TABLE stat DROP PARTITION p190214, p190215

MySQL 千万级数据表 partition 实战应用相关推荐

  1. mysql explain 为空_车祸现场!我的MySQL千万级数据表选错索引了!

    最近在线上环境遇到了一次SQL慢查询引发的数据库故障,影响线上业务.经过排查后,确定原因是:SQL在执行时,MySQL优化器选择了错误的索引(不应该说是"错误",而是选择了实际执行 ...

  2. mysql千万级数据查询select、插入insert慢 可能原因总结

    mysql千万级数据查询select.插入insert慢 可能原因总结 表连表查询 并 insert ,insert into -select -from- insert into T1(XX,XX) ...

  3. 如何优化MySQL千万级大表

    很好的一篇博客,转载 如何优化MySQL千万级大表 原文链接::https://blog.csdn.net/yangjianrong1985/article/details/102675334 千万级 ...

  4. MySQL千万级大表优化解决方案

    MySQL千万级大表优化解决方案 参考文章: (1)MySQL千万级大表优化解决方案 (2)https://www.cnblogs.com/yliucnblogs/p/10096530.html 备忘 ...

  5. php mysql千万级数据修改_PHP 结合 MySQL 千万级数据处理

    mysql分表思路 一张一亿的订单表,可以分成五张表,这样每张表就只有两千万数据,分担了原来一张表的压力,分表需要根据某个条件进行分,这里可以根据地区来分表,需要一个中间件来控制到底是去哪张表去找到自 ...

  6. 来个硬货——长文解读:基于业务场景的MySQL千万级大表优化

    千万级大表如何优化,这是一个很有技术含量的问题,通常我们的直觉思维都会跳转到拆分或者数据分区,在此我想做一些补充和梳理,想和大家做一些这方面的经验总结,也欢迎大家提出建议. 从一开始脑海里开始也是火光 ...

  7. MySQL千万级数据量优化方案

    前言 千万级大表如何优化,这是一个很有技术含量的问题,通常我们的直觉思维都会跳转到拆分或者数据分区.除此之外,还有其他的思路和解决方案.根据本人多年的工作经验,做了如下总结. 方案 "千万级 ...

  8. MySQL千万级数据进行插入,基础数据3千万,插入1千万数据时间约为4.7分钟,10个线程同时插入

    测试MySQL千万条数据插入速度 使用多线程,每条线程处理数据100万条,每次插入携带数据7万条进行提交 数据库基数为0,插入1000万条数据,时间为311957毫秒,也就是311.957秒,约为5. ...

  9. mysql 亿级表count_码云社 | 砺锋科技-MySQL的count(*)的优化,获取千万级数据表的总行数 - 用代码改变世界...

    专注于Java领域优质技术号,欢迎关注 作者:李长念 一.前言 这个问题是今天朋友提出来的,关于查询一个1200w的数据表的总行数,用count(*)的速度一直提不上去.找了很多优化方案,最后另辟蹊径 ...

最新文章

  1. Linux开发板怎么用madplay,Linux中madplay 音乐播放器移植步骤
  2. python正则表达式提取电话号码_Python学习笔模式匹配与正则表达式之电话号码和Email地址提取程序...
  3. C语言去括号编程题,去括号 - C语言网
  4. LeetCode 1945. 字符串转化后的各位数字之和
  5. GitLab 安装配置指南
  6. 洛谷——P1023 税收与补贴问题
  7. ES6-改变对象的原型对象
  8. 服务器查内存型号,服务器怎样查内存型号
  9. python声明编码_Python 2.x 编码声明:是coding:utf-8还是coding=urf-8呢
  10. C++-文件【1】-按行读文本文件的两种方法
  11. nodejs进程异常退出处理方法
  12. 分治法的经典问题——大整数相乘
  13. 九段系统服务器,人力资源一卡通考勤系统
  14. webpack + vue 学习看过的文章 网址
  15. CentOS7创建桌面快捷方式
  16. 如何区分网线是几类的_如何判断网线是几类线?
  17. c语言青蛙游戏,c语言:一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法?...
  18. prach---发端
  19. VScode 完整安装、配置及完全卸载
  20. 标称型和数值型(连续型)的区别

热门文章

  1. B-树的一点既不形象又不恰当的比喻
  2. Java多线程3:Thread中的静态方法
  3. 有了jsRender,妈妈再也不用担心我用jq拼接DOM拼接的一团糟了、页面整齐了、其他伙伴读代码也不那么费劲了...
  4. 【思科】BGP的community属性解析
  5. cocos2d-x 2.0启用HD高清图片支持
  6. 《Programming Ruby 中文版第二版》P577页singleton_method_undefined方法说明有点问题
  7. spring_bean三种装配方式
  8. 【RPA干货来袭】 UiBot关于如何使用浏览器调用JS命令的说明
  9. MicroPython技术及应用定义
  10. 如何实现报表设计中的高精度报表套打?