数据库水平分表
1. 前言:但数据库数据到达千万级别的时候,查询如果不按索引查就会非常慢,于是这里打算利用水平分表来优化一下查询,提高效率
2. 分表:取我当前表的某一列的前两个数字进行二级分表,将千万数据化分成十万。
-- 首先执行循环建表: create procedure sum1(a int) begin declare sum int default 0; -- default 是指定该变量的默认值 declare i int default 0; -- 循环下标 while i<=a DO -- 循环开始 set i=i+1; set @sql_create_table = concat( 'CREATE TABLE IF NOT EXISTS tbCid_0', i, "( `keyCid` varchar(32) NOT NULL, `mcc` varchar(3) NOT NULL, `mnc` varchar(2) NOT NULL, `lac` varchar(12) NOT NULL, `cid` varchar(12) NOT NULL, `country` varchar(32) NOT NULL, `province` varchar(32) NULL DEFAULT NULL, `city` varchar(32) NULL DEFAULT NULL, `district` varchar(32) NULL DEFAULT NULL, `road` varchar(64) NULL DEFAULT NULL, `street` varchar(64) NULL DEFAULT NULL, `pos` varchar(64) NULL DEFAULT NULL, `detailpos` varchar(256) NULL DEFAULT NULL, `longitude` varchar(32) NULL DEFAULT NULL, `latitude` varchar(32) NULL DEFAULT NULL, `idxAreaId` varchar(128) NULL DEFAULT NULL, `remark` varchar(256) NULL DEFAULT NULL, `mdfTm` datetime(0) NOT NULL, `mdfBy` varchar(45) NOT NULL, `crtTm` datetime(0) NOT NULL, `crtBy` varchar(45) NOT NULL, `idxOwnerId` varchar(128) NULL DEFAULT NULL, PRIMARY KEY (`keyCid`) USING BTREE, INDEX `idxAreaId`(`idxAreaId`) USING BTREE, INDEX `idxOwnerId`(`idxOwnerId`) USING BTREE )ENGINE=InnoDB DEFAULT CHARSET=utf8;"); PREPARE sql_create_table FROM @sql_create_table; EXECUTE sql_create_table; end while; -- 循环结束 -- 可加循环结束后操作语句 end -- 第二步执行 -- 执行存储过程 call sum1(100); -- 第三步执行 -- 删除存储过程 drop procedure if exists sum1;
3. 数据迁移
-- 查询个表数据条数 use information_schema; select table_name,table_rows from tables where TABLE_SCHEMA = '数据库名' and table_name like "表名%" order by table_rows desc;
4. 查询修改
-- 未完待续