mysql myisam 分表_mysql分表分区方案实测:MyISAM引擎分表 or mysql表分区

如题,两种数据分割方案哪种更好呢?关于这两种分割方案的基本概念请参照官方文档,我们这里只做方案性能测试:

1.创建表(这里有个无效的冗余索引user_id,历史因素这里先不管,两个表都有):

CREATE TABLE `rank_access_log_range` (

`id` bigint(20) NOT NULL AUTO_INCREMENT,

`user_id` bigint(20) DEFAULT NULL,

`model_name` varchar(30) NOT NULL COMMENT '访问模块',

`channel` varchar(20) DEFAULT NULL COMMENT '渠道',

`channel_keywords` varchar(560) DEFAULT NULL COMMENT '渠道搜索关键字',

`refer_id` varchar(64) DEFAULT NULL,

`ip` varchar(128) DEFAULT NULL,

`begin_time` datetime NOT NULL COMMENT '开始运行时间',

`run_time` int(11) NOT NULL COMMENT '运行时间',

`http_status` smallint(6) DEFAULT NULL COMMENT 'http错误码',

`error_code` varchar(20) DEFAULT NULL COMMENT '业务错误码',

`error_msg` json DEFAULT NULL,

`request_params` varchar(500) DEFAULT NULL COMMENT '请求参数',

PRIMARY KEY (`id`,`begin_time`),

KEY `begin_time` (`begin_time`) USING BTREE,

KEY `rank_access_log_user_id_index` (`user_id`) USING BTREE,

KEY `ix_user_id_model_name` (`user_id`,`model_name`) USING BTREE,

KEY `ix_channel_refer_id` (`channel`,`refer_id`)

) ENGINE=InnoDB AUTO_INCREMENT=13320661 DEFAULT CHARSET=utf8 COMMENT='访问日志'

/*!50500 PARTITION BY RANGE  COLUMNS(begin_time)

(PARTITION p201604 VALUES LESS THAN ('2016-05-01') ENGINE = InnoDB,

PARTITION p201605 VALUES LESS THAN ('2016-06-01') ENGINE = InnoDB,

PARTITION p201606 VALUES LESS THAN ('2016-07-01') ENGINE = InnoDB,

PARTITION p201607 VALUES LESS THAN ('2016-08-01') ENGINE = InnoDB,

PARTITION p201608 VALUES LESS THAN (MAXVALUE) ENGINE = InnoDB) */;

CREATE TABLE `rank_access_log` (

`id` bigint(20) NOT NULL,

`user_id` bigint(20) DEFAULT NULL,

`model_name` varchar(30) NOT NULL COMMENT '访问模块',

`channel` varchar(20) DEFAULT NULL COMMENT '渠道',

`channel_keywords` varchar(560) DEFAULT NULL COMMENT '渠道搜索关键字',

`refer_id` varchar(64) DEFAULT NULL COMMENT '如果来自BD活动,referId记录BD方代码;销售推广记录销售员id;用户推荐记录推荐人id',

`ip` varchar(128) DEFAULT NULL,

`begin_time` datetime NOT NULL COMMENT '开始运行时间',

`run_time` int(11) NOT NULL COMMENT '运行时间',

`http_status` smallint(6) DEFAULT NULL COMMENT 'http错误码',

`error_code` varchar(20) DEFAULT NULL COMMENT '业务错误码',

`error_msg` json DEFAULT NULL,

`request_params` varchar(500) DEFAULT NULL COMMENT '请求参数',

PRIMARY KEY (`id`),

KEY `begin_time` (`begin_time`) USING BTREE,

KEY `rank_access_log_user_id_index` (`user_id`) USING BTREE,

KEY `ix_user_id_model_name` (`user_id`,`model_name`) USING BTREE,

KEY `ix_channel_refer_id` (`channel`,`refer_id`) USING BTREE

) ENGINE=MRG_MyISAM DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC UNION=(`rank_access_log_2016_02`,`rank_access_log_2016_03`,`rank_access_log_2016_04`,`rank_access_log_2016_05`,`rank_access_log_2016_06`,`rank_access_log_2016_07`,`rank_access_log_2016_08`,`rank_access_log_2016_09`,`rank_access_log_2016_10`,`rank_access_log_2016_11`,`rank_access_log_2016_12`)

COMMENT='访问日志';

2.看下两张表的测试数据量:

ccc8c9ee97559b0e1bc58c296f5d1ea4.png

dcfabdc900cac7f93aed4adcf96e8002.png

两张表都是1300w的数据。

3.insert测试(毋容置疑,肯定是merge表插入快,这是分表比分区的优势):

e3d632e40a4369260cb4d3f4675f92b8.png

3d5adf716dba6f14fe950123bf52f84f.png

但是这里差距确实有点大。。。千万数据的索引校验和几十万数据的索引校验的差距。

4.简单select测试:

select count:

984537ecd368e4d4d2d88f9b2de1824a.png

select *:

7658eb8d07a36e4e65f5f6d602388198.png

e31f70b76fc24e08abecf41421661a18.png

这里,mysql分区表略胜一筹。

5.复杂select:

第一组:

b5c1f5d810857c5ae59ea9a365b41b0e.png

3411451ab2667025b62e876101d73218.png

第二组:

842b2afaaadc5f3a182dea0d950c634e.png

61149d823d5ad81d6b732ae556792874.png

第三组:

e34e793f941bef71bb8726b5b7afcb0c.png

8be89a374013428a9e6844d0d488bc2f.png

结论:

MyISAM merge表完爆mysql分区表。。完毕。

后记:

博客确实做的太烂,截图看不清楚的,请使用浏览器的放大功能。。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值