用的工具是:Navicat for MySQL,在其中定义了几个存储过程。要拆分的大表:tcc_method_coverage,其中有一个字段名:table_name,我们就是要根据table_name的值,将tcc_method_coverage表的数据进行分组,譬如,table_name的值为abc,那么,就将tcc_method_coverage表中所有table_name值为abc的记录全部“挪移”到一张新表abc_mc,并且,给这张新表建立索引。

总共5个存储过程:

总执行入口(transfer_method_data):

 

 
  
  1. begin 
  2.     declare v_table_name varchar(200); 
  3.     declare flag int default 0; 
  4.  
  5.     declare curl cursor for select DISTINCT table_name from tcc_method_coverage; 
  6.      
  7.     declare continue handler for sqlstate '02000' set flag = 1; 
  8.  
  9.     open curl; 
  10.      
  11.     fetch curl into v_table_name; 
  12.  
  13.     WHILE(flag != 1) DO 
  14.         call create_table_if_not_exist(CONCAT(v_table_name, '_mc')); 
  15.         call drop_table_index(CONCAT(v_table_name, '_mc')); 
  16.         call insert_data_to_table(CONCAT(v_table_name, '_mc'), v_table_name); 
  17.         call create_table_index(CONCAT(v_table_name, '_mc')); 
  18.         fetch curl into v_table_name; 
  19.     end WHILE; 
  20.  
  21.     close curl; 
  22.  
  23. end 

create_table_if_not_exist:

参数类型是:

 
  
  1. `new_table_name` varchar(200) 
 
  
  1. BEGIN 
  2.     declare v_create_table_sql varchar(1000); 
  3.  
  4.     set @v_create_table_sql = CONCAT('create table if not exists ', new_table_name, ' ( 
  5.         id int(11) NOT NULL AUTO_INCREMENT, 
  6.                 name varchar(500) DEFAULT NULL
  7.                 class_coverage double DEFAULT NULL
  8.                 class_ratio varchar(100) DEFAULT NULL
  9.                 method_coverage double DEFAULT NULL
  10.                 method_ratio varchar(100) DEFAULT NULL
  11.                 block_coverage double DEFAULT NULL
  12.                 block_ratio varchar(100) DEFAULT NULL
  13.                 line_coverage double DEFAULT NULL
  14.                 line_ratio varchar(100) DEFAULT NULL
  15.                 class_fail char(1) DEFAULT NULL
  16.                 method_fail char(1) DEFAULT NULL
  17.                 block_fail char(1) DEFAULT NULL
  18.                 line_fail char(1) DEFAULT NULL
  19.                 class_id int(11) DEFAULT NULL
  20.                 table_name varchar(200) DEFAULT NULL
  21.                 dateTime datetime DEFAULT NULL
  22.                 primary key(id) 
  23.                 ) ENGINE=InnoDB DEFAULT CHARSET=gbk'); 
  24.  
  25.  
  26.     #select v_create_table_sql; 
  27.     PREPARE stmt from @v_create_table_sql; 
  28.     EXECUTE stmt; 
  29.  
  30. END 

drop_table_index:

 

参数类型是:

 
  
  1. `new_table_name` varchar(200) 

 

 
  
  1. BEGIN 
  2.     declare v_index_name varchar(500); 
  3.     declare v_select_index_sql varchar(500); 
  4.     declare v_drop_index_sql varchar(500); 
  5.      
  6.     set v_index_name = CONCAT(new_table_name, '_cid'); 
  7.  
  8.     select count(*) into @cnt from information_schema.statistics where table_name=new_table_name and index_name=v_index_name; 
  9.  
  10.     if @cnt > 0 then 
  11.         set @v_drop_index_sql = CONCAT('drop index ', v_index_name, ' on ', new_table_name); 
  12.         prepare stmt from @v_drop_index_sql; 
  13.         EXECUTE stmt; 
  14.     end if; 
  15.  
  16. END 

 insert_data_to_table:

参数类型是:

 

 
  
  1. `new_table_name` varchar(200),`table_name` varchar(200) 

 

 
  
  1. BEGIN 
  2.     declare v_insert_sql varchar(1000); 
  3.  
  4.     set @v_insert_sql = CONCAT('insert into ', new_table_name, ' ( 
  5.                 name
  6.                 class_coverage, 
  7.                 class_ratio, 
  8.                 method_coverage, 
  9.                 method_ratio, 
  10.                 block_coverage, 
  11.                 block_ratio, 
  12.                 line_coverage, 
  13.                 line_ratio, 
  14.                 class_fail, 
  15.                 method_fail, 
  16.                 block_fail, 
  17.                 line_fail, 
  18.                 class_id, 
  19.                 table_name, 
  20.                 dateTime 
  21.                 ) SELECT name
  22.                 class_coverage, 
  23.                 class_ratio, 
  24.                 method_coverage, 
  25.                 method_ratio, 
  26.                 block_coverage, 
  27.                 block_ratio, 
  28.                 line_coverage, 
  29.                 line_ratio, 
  30.                 class_fail, 
  31.                 method_fail, 
  32.                 block_fail, 
  33.                 line_fail, 
  34.                 class_id, 
  35.                 table_name, 
  36.                 dateTime 
  37.                 FROM tcc_method_coverage 
  38.                 WHERE table_name = \'', table_name, '\''); 
  39.  
  40.     PREPARE stmt from @v_insert_sql; 
  41.     EXECUTE stmt; 
  42.      
  43. END 

create_table_index:

参数类型是:

 

 
  
  1. `new_table_name` varchar(200) 

 

 
  
  1. BEGIN 
  2.     declare v_index_name varchar(500); 
  3.     declare v_table_column varchar(500); 
  4.     declare v_create_index_sql varchar(500); 
  5.  
  6.     set v_index_name = CONCAT(new_table_name, '_cid'); 
  7.     set v_table_column = CONCAT(new_table_name, '(''class_id'')'); 
  8.  
  9.     #create index 
  10.     set @v_create_index_sql = CONCAT('create index ', v_index_name, ' on ', v_table_column); 
  11.      
  12.     prepare stmt from @v_create_index_sql; 
  13.     EXECUTE stmt; 
  14.  
  15. END 

也是参考了网上的一些资料,然后自己跌跌撞撞地写出来的mysql存储过程代码,记录在此,权当一份记忆(毕竟,咱也稍微写过一下存储过程,呵呵)。当然拆表的事情也可以通过java+jdbc去做。不过,在这里,的确是存储过程更直接方便一些。