zoukankan      html  css  js  c++  java
  • mysql分表实战

    本文主要讲述如何使用存储过程完成本表.并不讨论其他问题.首先我们得看看手册上关于meger引擎的说明:

    MERGE存储引擎,也被认识为MRG_MyISAM引擎,是一个相同的可以被当作一个来用的MyISAM表的集合。“相同”意味着所有表同样的列和索引信息。你不能合并列被以不同顺序列于其中的表,没有恰好同样列的表,或有不同顺序索引的表。而且,任何或者所有的表可以用myisampack来压缩。

    首先看看要分的表t3,总共有5000000条记录.t3表的结构如下:

    CREATE TABLE `t3` (
    `id` int(11) NOT NULL auto_increment,
    `name` varchar(50) default NULL,
    `post` text,
    PRIMARY KEY (`id`),
    UNIQUE KEY `id` (`id`)
    ) ENGINE=MyISAM AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

    没有测试数据?那就先运行这个存储过程写入一些吧
     

    -- Procedure "insert_isam" DDL

    CREATE PROCEDURE `insert_isam`(in item integer)
    begin
    declare counter int;
    set counter = item;
    while counter >= 1 do
    insert into t3 values(counter,concat('mysqlsystems.com',counter),repeat('bla',10));
    set counter = counter - 1;
    end while;
    end;

    执行查询:
     

    call insert_isam(5000000);

    这样就有了测试数据,注意这个过程有点慢,曾经尝试插入1亿条记录,结果死机了.
    由于这样产生的数据都是连续的数据,所以按照ID的区间来排序,我们把这个表按照每个表250000条来拆分,当然了这些表的结构要与t3一致,而且存储引擎要为myisam.至于分多少个表,我们无法确定,但是我们可以采用分页的原理来拆分,刚学存储过程,试着摸索写了一个
     

    -- Procedure "split_table" DDL

    CREATE PROCEDURE `split_table`(in pagesize int)
    begin
    set @totalRecord=(select count(id) from t3);
    set @totalPage=ceiling(@totalRecord/pagesize);
    set @page=1;
    while @page<=@totalPage do
    set @tableName=concat("tab_",@page);
    set @droptable=concat("drop table if exists ",@tableName);
    prepare s from @droptable;
    execute s;
    set @sql=concat("
    CREATE TABLE ",@tableName," (
    `id` int(11) auto_increment,
    `name` varchar(50),
    `post` text,
    PRIMARY KEY (`id`),
    KEY `id` (`id`)
    ) ENGINE=MyISAM;");
    PREPARE sta from @sql;
    execute sta;
    set @from=(@page-1)*pagesize+1;
    set @end=@page*pagesize;
    set @sql=concat("insert into ",@tableName," select * from t3 where id between ",@from," and ",@end);
    PREPARE sta from @sql;
    execute sta;
    set @page=@page+1;
    end while;
    end;

     
    执行查询:

    call split_table(250000);

    这个过程有点慢,需要耐心等待,脚本执行完成之后,看到已经生成了20张以tab开头的表,每个表的记录都是250000条,到这里为止,我们已经完成了表的拆分过程,接下来得创建一个merge类型的表

    CREATE TABLE `taball` (
    `id` int(11) NOT NULL auto_increment,
    `name` varchar(50) default NULL,
    `post` text,
    PRIMARY KEY (`id`),
    KEY `id` (`id`)
    ) ENGINE=MRG_MyISAM union=(tab_1,tab_2,tab_3,tab_4,tab_5,tab_6,tab_7,tab_8,
    tab_9,tab_10,tab_11,tab_12,tab_13,tab_14,tab_15,tab_16,tab_17,tab_18,tab_19,tab_20);

    执行之后,看看 taball表,记录和原来的表一样多..
     
    做下简单的测试,分别对t3,和taball执行"select * from t3 limit 250000,10000",对比下,后者快了很多.
     
    到此为止,基本完成了分表.其优缺点还有待于摸索!
  • 相关阅读:
    mysql5.5的安装与配置(亲测版)
    CentOS 6.5升级Python和安装IPython(亲测可用)
    运维mysql基础
    linux命令巧用,随手记
    《大话设计模式》——建造者模式
    《大话设计模式》——外观模式
    《大话设计模式》——模版方法模式
    抽象类和接口的区别
    《大话设计模式》——原型模式
    《大话设计模式》——工厂方法模式
  • 原文地址:https://www.cnblogs.com/zengda/p/4732320.html
Copyright © 2011-2022 走看看