数据库 mysql 单表数据量达到千万、亿级,可以通过分表与表分区提升服务性能。

现有表accounting,4亿条数据,数据访问方式为insert与select,select为按月访问,为减少数据与程序变更,采用表分区的方式。

数据表create语句:

CREATE TABLE `accounting` (
`date` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
`nas` varchar(16) NOT NULL DEFAULT '',
`uid` varchar(20) NOT NULL DEFAULT '',
`terminal` varchar(20) DEFAULT NULL,
`client_ip` varchar(16) NOT NULL DEFAULT '',
`type` varchar(20) DEFAULT NULL,
`service` varchar(20) DEFAULT NULL,
`priv_lvl` int(2) DEFAULT NULL,
`cmd` varchar(255) DEFAULT NULL,
`elapsed_time` int(6) DEFAULT NULL,
`bytes_in` int(10) DEFAULT NULL,
`bytes_out` int(10) DEFAULT NULL,
`id` bigint(20) NOT NULL AUTO_INCREMENT,
PRIMARY KEY (`id`, `date`),                                      按月分表,date需要为primary key
KEY `date_index` (`date`),
KEY `acct_index` (`uid`),
KEY `nas_index` (`nas`),
KEY `client_index` (`client_ip`),
KEY `nas_date` (`date`,`nas`)
) ENGINE=MyISAM AUTO_INCREMENT=1 DEFAULT CHARSET=latin1

PARTITION BY RANGE (to_days(date)) (
PARTITION p201409 VALUES LESS THAN (to_days('2014-10-01')),
PARTITION p201410 VALUES LESS THAN (to_days('2014-11-01')),
PARTITION p201411 VALUES LESS THAN (to_days('2014-12-01')),
PARTITION p201412 VALUES LESS THAN (to_days('2015-01-01')),
PARTITION p201501 VALUES LESS THAN (to_days('2015-02-01')),
PARTITION p201502 VALUES LESS THAN (to_days('2015-03-01')),
PARTITION p201503 VALUES LESS THAN (to_days('2015-04-01')),
PARTITION p201504 VALUES LESS THAN (to_days('2015-05-01')),
PARTITION p201505 VALUES LESS THAN (to_days('2015-06-01')),
PARTITION p201506 VALUES LESS THAN (to_days('2015-07-01')),
PARTITION p201507 VALUES LESS THAN (to_days('2015-08-01')),
PARTITION p201508 VALUES LESS THAN (to_days('2015-09-01')),
PARTITION p201509 VALUES LESS THAN (to_days('2015-10-01')),
PARTITION p201510 VALUES LESS THAN (to_days('2015-11-01')),
PARTITION p201511 VALUES LESS THAN (to_days('2015-12-01')),
PARTITION p201512 VALUES LESS THAN (to_days('2016-01-01')),
PARTITION p201601 VALUES LESS THAN (to_days('2016-02-01')),
PARTITION p201602 VALUES LESS THAN (to_days('2016-03-01')),
PARTITION p201603 VALUES LESS THAN (to_days('2016-04-01')),
PARTITION p201604 VALUES LESS THAN (to_days('2016-05-01')),
PARTITION p201605 VALUES LESS THAN (to_days('2016-06-01')),
PARTITION p201606 VALUES LESS THAN (to_days('2016-07-01')),
PARTITION p201607 VALUES LESS THAN (to_days('2016-08-01')),
PARTITION p201608 VALUES LESS THAN (to_days('2016-09-01')),
PARTITION p201609 VALUES LESS THAN (to_days('2016-10-01')),
PARTITION p201610 VALUES LESS THAN (to_days('2016-11-01')),
PARTITION p201611 VALUES LESS THAN (to_days('2016-12-01')),
PARTITION p201612 VALUES LESS THAN (to_days('2017-01-01')),
PARTITION p201701 VALUES LESS THAN (to_days('2017-02-01')),
PARTITION p201702 VALUES LESS THAN (to_days('2017-03-01')),
PARTITION p201703 VALUES LESS THAN (to_days('2017-04-01')),
PARTITION p201704 VALUES LESS THAN (to_days('2017-05-01')),
PARTITION p201705 VALUES LESS THAN (to_days('2017-06-01')),
PARTITION p201706 VALUES LESS THAN (to_days('2017-07-01')),
PARTITION p201707 VALUES LESS THAN (to_days('2017-08-01')),
PARTITION p201708 VALUES LESS THAN (to_days('2017-09-01')),
PARTITION p201709 VALUES LESS THAN (to_days('2017-10-01')),
PARTITION p201710 VALUES LESS THAN (to_days('2017-11-01')),
PARTITION p201711 VALUES LESS THAN (to_days('2017-12-01')),
PARTITION p201712 VALUES LESS THAN (to_days('2018-01-01')),
PARTITION p201801 VALUES LESS THAN (to_days('2018-02-01')),
PARTITION p201802 VALUES LESS THAN (to_days('2018-03-01')),
PARTITION p201803 VALUES LESS THAN (to_days('2018-04-01')),
PARTITION p201804 VALUES LESS THAN (to_days('2018-05-01')),
PARTITION p201805 VALUES LESS THAN (to_days('2018-06-01')),
PARTITION p201806 VALUES LESS THAN (to_days('2018-07-01')),
PARTITION p201807 VALUES LESS THAN (to_days('2018-08-01')),
PARTITION p201808 VALUES LESS THAN (to_days('2018-09-01')),
PARTITION p201809 VALUES LESS THAN (to_days('2018-10-01')),
PARTITION p201810 VALUES LESS THAN (to_days('2018-11-01')),
PARTITION p201811 VALUES LESS THAN (to_days('2018-12-01')),
PARTITION p201812 VALUES LESS THAN (to_days('2019-01-01')),
PARTITION p2019 VALUES LESS THAN (MAXVALUE) )
;

为了使用分区功能,进行查询的语句需与创建分区方式的一致:

错误:explain select * from accounting where date="2014-09-25 15:01:59";    发现访问方法为 ALL,效率最低,索引等也是NULL

正确:explain select count(*) from accounting where date < date("2014-09-26");

rows代表将要扫描的条数,如过选择了某个月的条件,那么将扫描具体月份的MYD。此时如果where中再有条件(column有索引),type将变为ref,或者:

explain select * from accounting where date = date('2015-05-01 01:23:34');

((1L, 'SIMPLE', 'accounting', 'ref', 'date_index,nas_date', 'date_index', '8', 'const', 1L, ''),)

照猫画虎,欢迎批评

转载于:https://www.cnblogs.com/gengwudaxia/p/5961367.html

mysql按月进行表分区相关推荐

  1. mysql 社区版 innodb_MySQL 表分区详解MyiSam引擎和InnoDb 区别(实测)

    MySQL 表分区详解MyiSam引擎和InnoDb 区别(实测) / --------------------         写在最前面            ------------------ ...

  2. mysql 对已有表分区_mysql怎么对先有表进行分区

    mysql如何对先有表进行分区? 有一张表,已经创建了,是一张普通的表,先要对这张表进行hash分区,我用一下语句创建提示错误: mysql> alter table 33 -> part ...

  3. mysql 按月建表_MySQL之存储过程按月创建表

    具体不多说,直接上代码.欢迎一起交流和学习. 创建一个按月创建表的存储过程,SQL语句如下: DELIMITER // DROP PROCEDURE IF EXISTS create_table_by ...

  4. mysql按照省市给表分区_表分区-partition

    partition分区: 设置分区限制,t0:1-10,t1:10-20,t2:20-最大值: 插入数据后可以看到topic表出现了t0.t1.t2: 按照散点值分区: 创建地区表: 建立会员表,根据 ...

  5. mysql 按月分表的查询_mysql按月分表, 组合查询

    每个月月底最后一天建好下个月的空表 或每年底建1到12月的空表 , table_201901,table_201902,table_201903 增加记录不需要修改,insert到当月对应表就好了. ...

  6. mysql 存储过程月单拆天单_MySQL之存储过程按月创建表的方法步骤

    具体不多说,直接上代码.欢迎一起交流和学习. 创建一个按月创建表的存储过程,SQL语句如下: DELIMITER // DROP PROCEDURE IF EXISTS create_table_by ...

  7. mysql 删除hash分区_MySQL-如何删除hash表分区

    一个大表,之前是以hash分区表的形式存在的, MySQL> show create table history_uint; | history_uint | CREATE TABLE `his ...

  8. mysql 存储过程创建表_MySQL之存储过程按月创建表的方法步骤

    具体不多说,直接上代码.欢迎一起交流和学习. 创建一个按月创建表的存储过程,SQL语句如下: DELIMITER // DROP PROCEDURE IF EXISTS create_table_by ...

  9. mysql数据库表分区

    一.表分区 1.对表分区的原因 数据库数据越来越大,导致单个表中数据太多.以至于增删改查询速度变慢,而且由于表的锁机制导致应用操作也受到严重影响,出现了数据库性能瓶颈. 2.表分区 表分区就是将一个表 ...

最新文章

  1. PostgresSQL生成UUID
  2. SSH免密码登录设置
  3. 系统 CPU 突然飙升且 GC 频繁,如何排查
  4. SGU 185 Two shortest
  5. HLS Pragma(3)config_storage
  6. mysql 索引都有哪些_MySQL 数据库的优化,你知道有哪些?
  7. 小程序2-基本架构讲解(一)WXSS样式
  8. Xamarin Android Webview中JS调用App中的C#方法
  9. 2013年计算机考试ppt,2013年全国专业技术人员计算机应用能力考试PPT题库
  10. C#foreach循环的优点
  11. lazada发货_Lazada发货要求及注意事项
  12. HR_Hash Tables: Ransom Note
  13. java中常用的类——System类
  14. c语言中求tana反函数,反正切函数arctanx的导数是什么
  15. 微信小程序开发者文档 开放文档 地址
  16. 科学家做一个实验,我就得胖三斤?
  17. java入门学习(三:数据类型)
  18. SafeNet在软件保护与授权领域有三大知名品牌
  19. 警醒篇:如何做人?(转载)
  20. html字体下划线下移,CSS下划线与文字间距距离设置(CSS文字下划线距离设置)

热门文章

  1. java collection api_Java Stream和Collection比较:何时以及如何从Java API返回?
  2. MFC+GDI+绘制出雷达余晖效果
  3. linux教程opensuse,OpenSUSE/Linux 网络配置
  4. 操作系统基础:进程知识笔记(三)
  5. 前端:JS操作数字类库
  6. python车牌识别逆光怎么办代码_这摄像头除了能逆光识别车牌,还会跟人打招呼?...
  7. java ffmpeg 获取视频时长_Java通过调用FFMPEG获取视频时长
  8. redis的lrange_thinkphp5操作redis系列教程】列表类型之lRange,lGetRange
  9. AND、OR运算符的组合使用
  10. 手写一个合格的前端脚手架