码迷,mamicode.com
首页 > 数据库 > 详细

使用Merge存储引擎实现MySQL分表

时间:2017-03-27 18:25:23      阅读:352      评论:0      收藏:0      [点我收藏+]

标签:ast   连接池   操作   ges   意思   arc   image   技术   rom   

一、使用场景

  Merge表有点类似于视图。使用Merge存储引擎实现MySQL分表,这种方法比较适合那些没有事先考虑分表,随着数据的增多,已经出现了数据查询慢的情况。

这个时候如果要把已有的大数据量表分开比较痛苦,最痛苦的事就是改代码。所以使用Merge存储引擎实现MySQL分表可以避免改代码。

  Merge引擎下每一张表只有一个MRG文件。MRG里面存放着分表的关系,以及插入数据的方式。它就像是一个外壳,或者是连接池,数据存放在分表里面。

对于增删改查,直接操作总表即可。

二、建表

  1.用户1表

  CREATE TABLE IF NOT EXISTS user1 (
     id int(11) NOT NULL AUTO_INCREMENT,  
     name varchar(50) DEFAULT NULL,  
     sex int(1) NOT NULL DEFAULT 0,  
  PRIMARY KEY (id)  
  ) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;  

  2.用户2表

  CREATE TABLE IF NOT EXISTS user2 (  
    id int(11) NOT NULL AUTO_INCREMENT,  
     name varchar(50) DEFAULT NULL,  
    sex int(1) NOT NULL DEFAULT 0,  
   PRIMARY KEY (`id`)  
  ) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ; 

  3.主表

   CREATE TABLE IF NOT EXISTS alluser (  
     id int(11) NOT NULL AUTO_INCREMENT,  
     name varchar(50) DEFAULT NULL,  
     sex int(1) NOT NULL DEFAULT 0,  
   INDEX(id)) ENGINE = MERGE UNION=(user1,user2) INSERT_METHOD=LAST AUTO_INCREMENT=1 ;  

  1) ENGINE = MERGE 和 ENGINE = MRG_MyISAM是一样的意思,都是代表使用的存储引擎是 Merge。

  2) INSERT_METHOD,表示插入方式,取值可以是:0 和 1,0代表不允许插入,1代表可以插入;

  3) FIRST插入到UNION中的第一个表,LAST插入到UNION中的最后一个表。

三、操作

  1. 先在user1表中增加一条数据,然后再在user2表中增加一条数据,查看 alluser中的数据。当然这种操作是不正确的,因为我们只在总表上操作(增删改查),但是当增加的时候 我们同样可以在alluser中增加一条id相同的记录。

   insert into user1(name,sex) values (‘张三‘,1);

   insert into user2(name,sex) values (‘李四‘,2);

    select * from alluser;  发现是刚刚插入的数据如下:

   技术分享

     这就出现了一个id重复,这就造成了当删除和修改的时候异常,解决办法是给 alluser的id赋唯一值。

     我们解决方法是,重新建立一张表tb_ids(id int),然后在alluser表中建立一个触发器,触发器的功能是 当在alluser表中增加一条记录时,取出tb_ids中的id值,然后将tb_ids的id值加1,

   触发器内容如下:   

   DELIMITER $$
   CREATE TRIGGER tr_seq
   BEFORE INSERT on alluser 
   FOR EACH ROW BEGIN 
      select id  into @testid from tb_ids limit 1;
      update tb_ids set id = @testid + 1;
   set new.id =  @testid;
   END$$
   DELIMITER;

 

  2.在总表中增加一条数据,

    insert into alluser(name,sex) values(‘王五‘,1);

    insert into alluser(name,sex) values(‘赵六‘,2);

    

  

 

使用Merge存储引擎实现MySQL分表

标签:ast   连接池   操作   ges   意思   arc   image   技术   rom   

原文地址:http://www.cnblogs.com/xbq8080/p/6628034.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!