• Mysql-分库分区分表


    大数据-分表分区分库
    问题集:
    1、分表时两张表的数据都一样么?如果一样,只是降低了表的访问量,但是如果数据多了还是没有提高查询的效率
    答:分表是对一张表中的数据按照某种规则进行拆分到三张表中,三张表的所有数据才是完整的数据
    2、如果是分库,分表联合使用,那么一个库进行读,一个库进行写,那么数据时怎么保持一致呢
    为什么要进行数据库数据表的分离:
    一个数据库,一张表,随着时间的推移,客户量的增多,一张表的数据量就很容易的提高一个甚至更多的量级,
    那么我们进行修改和查询就很费时,所以需要对数据进行切分操作。
    分区 :就是把一张表的数据分成N个区块,在逻辑上看最终只是一张表,但底层是由N个物理区块组成的

    分表 :就是把一张表按一定的规则分解成N个具有独立存储空间的实体表。系统读写时需要根据定义好的规则得到对应的字表明,然后操作它。

    分库:就是分成多个数据库实例,每个数据库实例中表名相同
    什么时候进行分区、分表:
    1、当数据特别大但是访问的人不多时可以只进行分区
     2、当数据特别大访问的人多时进行分表和分区结合
    什么时候进行分库:
    当一个数据库不足以存储所有的数据时
    分库的规则:1.垂直拆分:根据不同的业务种类在不同的数据库存储不同的数据信息(最好是0耦合)
    垂直分库-->水平分库-->读写分离
    对于分表的处理:
    通过创建分表和总表(汇总了所有分表的数据),添加数据时以总表为模板创建数据,以某种计算规则得出添加到什么分表中,这样就不会出现总表中主键冲突的问题
    查询时也是同样,以某种规则得到查询的时什么分表中的数据
    分区执行代码分析:

    CREATE TABLE IF NOT EXISTS `user` (   
       `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '用户ID',   
       `name` varchar(50) NOT NULL DEFAULT '' COMMENT '名称',   
       `sex` int(1) NOT NULL DEFAULT '0' COMMENT '0为男,1为女',   
       PRIMARY KEY (`id`)   
    ) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=1
    
    PARTITION BY RANGE (id) (   
         PARTITION p0 VALUES LESS THAN (3),   
         PARTITION p1 VALUES LESS THAN (6),   
         PARTITION p2 VALUES LESS THAN (9),
         PARTITION p3 VALUES LESS THAN (12),   
         PARTITION p4 VALUES LESS THAN MAXVALUE   
    );

    创建一个用户,并通过id进行分区处理

    alter table user drop partition p2;

     删除分区信息,同时也会删除该分区中的数据

    alter table user partition by RANGE(id)
    (PARTITION p1 VALUES less than (5),   
    PARTITION p2 VALUES less than (10),   
    PARTITION p3 VALUES less than MAXVALUE);

     重排分区信息

    alter table user1 add partition(partition p4 values less than MAXVALUE);

     添加分区信息

    alter table user1 add partition(partition p4 values less than (17));

    添加分区信息,使用前提,没有配置MAXVALUE
    分表代码执行分析

    CREATE TABLE IF NOT EXISTS `user1` (   
      `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '用户ID',   
      `name` varchar(50) NOT NULL DEFAULT '' COMMENT '名称',   
      `sex` int(1) NOT NULL DEFAULT '0' COMMENT '0为男,1为女',   
      PRIMARY KEY (`id`)   
    ) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=1
                
    CREATE TABLE IF NOT EXISTS `user2` (   
       `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '用户ID',   
       `name` varchar(50) NOT NULL DEFAULT '' COMMENT '名称',   
       `sex` int(1) NOT NULL DEFAULT '0' COMMENT '0为男,1为女',   
       PRIMARY KEY (`id`)   
    ) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=1

    创建两张表信息

    create table  user_total like user1;

    创建总表汇总来源于user1表

    ALTER TABLE user_total ENGINE=MRG_MYISAM UNION=(user1,user2) INSERT_METHOD=LAST;

    更改总表的数据来源,来源于表user1和表user2

    注意:在使用时,需要先分表再分区,先分区再分表会出现引擎无法再分区表中使用,无法创建分表

  • 相关阅读:
    codechef May Challenge 2016 CHSC: Che and ig Soccer dfs处理
    codechef May Challenge 2016 FORESTGA: Forest Gathering 二分
    codechef May Challenge 2016 LADDU: Ladd 模拟
    tp5 whereOr
    Null
    验证消息是否来自微信
    layer使用注意事项
    laravel 查询
    laravel form表单提交
    ajax上传文件
  • 原文地址:https://www.cnblogs.com/lixianglong/p/12195124.html
Copyright © 2020-2023  润新知