基于MyCat的按日期分片集群性能测试



# 创建MyCat配置文件,主要包括rule.xml和schema.xml
rule.xml中加入


	
		 
			 CREATE_TIME
			 sharding-by-date
		
	
	
        yyyy-MM-dd 
        2017-06-01            
		2017-06-15
        1  
         






	
		
		
select user() select user() select user()


# 创建所需服务和数据库
	参见 使用Docker部署基于MyCat的MySql https://internal-confluence.ssgm.net/pages/viewpage.action?pageId=1736724
	注意,要在3台服务器上各创建一个服务,每个服务内建立5个数据库,与上一步中的配置相对应

# 创建所需表
	连接MyCat的服务,创建表;其中,log为数据表,mac中保存几百条mac记录,用以批量生成测试数据


DROP TABLE IF EXISTS `log`;
CREATE TABLE `log` (
  `id` varchar(36) NOT NULL,
  `mac` varchar(17) DEFAULT '',
  `CREATE_TIME` datetime NOT NULL,
  `terminal_field_strength` varchar(8) DEFAULT '',
  `ssid_position` varchar(256) DEFAULT '',
  `access_ap_mac` varchar(17) DEFAULT '',
  `access_ap_channel` varchar(6) DEFAULT '',
  `access_ap_encryption_type` varchar(2) DEFAULT '',
  `x_coordinate` varchar(8) DEFAULT '',
  `y_coordinate` varchar(8) DEFAULT '',
  `netbar_wacode` varchar(14) DEFAULT '',
  `collection_equipment_id` varchar(21) DEFAULT '',
  `collection_equipment_longitude` varchar(15) DEFAULT '',
  `collection_equipment_latitude` varchar(15) DEFAULT '',
  `security_software_orgcode` varchar(10) DEFAULT '',
  KEY `index_time_mac` (`CREATE_TIME`,`mac`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;


DROP TABLE IF EXISTS `mac`;
CREATE TABLE `mac` (
  `mac` varchar(255) CHARACTER SET utf8 DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;


# 创建测试数据
  由于需要大量的测试数据,因此我们通过辅助表mac和存储过程来批量插入数据
  单独连接每台服务器上的MySQL进程,依次切换到db1-db5,导入mac.sql文件,并创建相应的存储过程
  注意,存储过程创建时要针对当前数据库修改参数值,让指定数据库插入指定日期的数据,否则会导致MyCat查询不到
  创建完存储过程后,依次在每个库上执行 call bat();每个库会插入390万条记录


CREATE PROCEDURE bat() 
BEGIN
	DECLARE v_start datetime DEFAULT STR_TO_DATE('2017-06-01','%Y-%m-%d');  -- 这里的日期要修改,规则为 第一台服务器db1 2017-06-01,db2 2017-06-02,...,第2台服务器 db1 2017-06-06 ....
	DECLARE v_sec INT DEFAULT 0;
	DECLARE v_step INT DEFAULT 3;
	DECLARE v_size INT DEFAULT 13000;		-- mac有300条记录,插入13000次,总计390万左右记录
	
	WHILE v_sec 


# 测试
	连接单独的数据库可以测试单数据库的效率,连接MyCat服务可以测试集群效率
        


# 测试结果及总结说明
 
为处理大数据量情况下数据库查询缓慢的问题,搭建MyCat分片集群,以提高查询性能
基本测试情况参见文件MyCat测试.xlsx
大数据量查询的时候,需要进行分页操作,而此时进行的查询主要有两个:
	1.查询具体数据
	2.统计所有记录数,用于前端生成页码
其中,主要有以下问题:
	前提:数据量大7000万左右,单库单表,使用表内分区
	1.
		a.当建立合适的索引时,并限定合适的查询条件,查询单页几十条数据且跳过的记录数不是很多时,查询时间仍在100毫秒以内,因此性能不是问题
		b.当a中,跳过的记录比较多时,如1500万,耗时大概在11秒左右,已经不可接受
	2.
		count()函数是最耗时的地方.概括说来,单库情况下,每秒大概可以统计220万左右记录,在使用了MyCat中间件后,性能降为150万左右/秒,
		整体来看,三台服务器,每台上面跑5个MySql进程,count()的性能达到1139万/秒,为单进程的5倍左右;
		从现象来看,MyCat的查询性能受限于数据量最大,耗时最长的分片,因此应该限制单个分片数据量大小

总结:
	使用MyCat,可以做到根据日期进行分片;
	要想查询保持在三四秒左右,每个分片的数据量应保持在最大五六百万左右
	以上测试基于4G内存,每台计算机上启动5个MySql进程,没有对MySql进行参数调整的情况下,
	理论上猜想,通过增加机器配置,增加实体机数量,以及通过参数调优,还可以有效提高数据库性能
	另外,此次测试没有使用merge分区表,猜想如果单库以日期分,库内表以小时进行分区,在精确时间查询的时候应该还会有效提高查询效率
 
索引策略:
	表结构:mac,enter_time,update_time
	写库:(mac,update_time) 插入新数据时,如果库里有相同mac,ap的n分钟内的记录,直接更新该记录的update_time,否则插入新的记录
	读库:依照具体查询来定,例如(phone,enter_time),(mac,enter_time),(enter_time)
	

# 创建MyCat配置文件,主要包括rule.xml和schema.xml
rule.xml中加入


	
		 
			 CREATE_TIME
			 sharding-by-date
		
	
	
        yyyy-MM-dd 
        2017-06-01            
		2017-06-15
        1  
         






	
		
		
select user() select user() select user()


# 创建所需服务和数据库
	参见 使用Docker部署基于MyCat的MySql https://internal-confluence.ssgm.net/pages/viewpage.action?pageId=1736724
	注意,要在3台服务器上各创建一个服务,每个服务内建立5个数据库,与上一步中的配置相对应

# 创建所需表
	连接MyCat的服务,创建表;其中,log为数据表,mac中保存几百条mac记录,用以批量生成测试数据


DROP TABLE IF EXISTS `log`;
CREATE TABLE `log` (
  `id` varchar(36) NOT NULL,
  `mac` varchar(17) DEFAULT '',
  `CREATE_TIME` datetime NOT NULL,
  `terminal_field_strength` varchar(8) DEFAULT '',
  `ssid_position` varchar(256) DEFAULT '',
  `access_ap_mac` varchar(17) DEFAULT '',
  `access_ap_channel` varchar(6) DEFAULT '',
  `access_ap_encryption_type` varchar(2) DEFAULT '',
  `x_coordinate` varchar(8) DEFAULT '',
  `y_coordinate` varchar(8) DEFAULT '',
  `netbar_wacode` varchar(14) DEFAULT '',
  `collection_equipment_id` varchar(21) DEFAULT '',
  `collection_equipment_longitude` varchar(15) DEFAULT '',
  `collection_equipment_latitude` varchar(15) DEFAULT '',
  `security_software_orgcode` varchar(10) DEFAULT '',
  KEY `index_time_mac` (`CREATE_TIME`,`mac`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;


DROP TABLE IF EXISTS `mac`;
CREATE TABLE `mac` (
  `mac` varchar(255) CHARACTER SET utf8 DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;


# 创建测试数据
  由于需要大量的测试数据,因此我们通过辅助表mac和存储过程来批量插入数据
  单独连接每台服务器上的MySQL进程,依次切换到db1-db5,导入mac.sql文件,并创建相应的存储过程
  注意,存储过程创建时要针对当前数据库修改参数值,让指定数据库插入指定日期的数据,否则会导致MyCat查询不到
  创建完存储过程后,依次在每个库上执行 call bat();每个库会插入390万条记录


CREATE PROCEDURE bat() 
BEGIN
	DECLARE v_start datetime DEFAULT STR_TO_DATE('2017-06-01','%Y-%m-%d');  -- 这里的日期要修改,规则为 第一台服务器db1 2017-06-01,db2 2017-06-02,...,第2台服务器 db1 2017-06-06 ....
	DECLARE v_sec INT DEFAULT 0;
	DECLARE v_step INT DEFAULT 3;
	DECLARE v_size INT DEFAULT 13000;		-- mac有300条记录,插入13000次,总计390万左右记录
	
	WHILE v_sec 


# 测试
	连接单独的数据库可以测试单数据库的效率,连接MyCat服务可以测试集群效率
        


# 测试结果及总结说明
 
为处理大数据量情况下数据库查询缓慢的问题,搭建MyCat分片集群,以提高查询性能
基本测试情况参见文件MyCat测试.xlsx
大数据量查询的时候,需要进行分页操作,而此时进行的查询主要有两个:
	1.查询具体数据
	2.统计所有记录数,用于前端生成页码
其中,主要有以下问题:
	前提:数据量大7000万左右,单库单表,使用表内分区
	1.
		a.当建立合适的索引时,并限定合适的查询条件,查询单页几十条数据且跳过的记录数不是很多时,查询时间仍在100毫秒以内,因此性能不是问题
		b.当a中,跳过的记录比较多时,如1500万,耗时大概在11秒左右,已经不可接受
	2.
		count()函数是最耗时的地方.概括说来,单库情况下,每秒大概可以统计220万左右记录,在使用了MyCat中间件后,性能降为150万左右/秒,
		整体来看,三台服务器,每台上面跑5个MySql进程,count()的性能达到1139万/秒,为单进程的5倍左右;
		从现象来看,MyCat的查询性能受限于数据量最大,耗时最长的分片,因此应该限制单个分片数据量大小

总结:
	使用MyCat,可以做到根据日期进行分片;
	要想查询保持在三四秒左右,每个分片的数据量应保持在最大五六百万左右
	以上测试基于4G内存,每台计算机上启动5个MySql进程,没有对MySql进行参数调整的情况下,
	理论上猜想,通过增加机器配置,增加实体机数量,以及通过参数调优,还可以有效提高数据库性能
	另外,此次测试没有使用merge分区表,猜想如果单库以日期分,库内表以小时进行分区,在精确时间查询的时候应该还会有效提高查询效率
 
索引策略:
	表结构:mac,enter_time,update_time
	写库:(mac,update_time) 插入新数据时,如果库里有相同mac,ap的n分钟内的记录,直接更新该记录的update_time,否则插入新的记录
	读库:依照具体查询来定,例如(phone,enter_time),(mac,enter_time),(enter_time)
	

你可能感兴趣的:(MySQL)