`
javasee
  • 浏览: 981422 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

mysql 分表方法实现

阅读更多

一般来说,当我们的数据库的数据超过了100w记录的时候就应该考虑分表或者分区了,这次我来详细说说分表的一些方法。目前我所知道的方法都是MYISAM的,INNODB如何做分表并且保留事务和外键,我还不是很了解。

首 先,我们需要想好到底分多少个表,前提当然是满足应用。这里我使用了一个比较简单的分表方法,就是根据自增id的尾数来分,也就是说分0-9一共10个 表,其取值也很好做,就是对10进行取模。另外,还可以根据某一字段的md5值取其中几位进行分表,这样的话,可以分的表就很多了。

好了,先来创建表吧,代码如下

Sql代码
    CREATE TABLE `test`.`article_0` (
    `id` BIGINT( 20 ) NOT NULL ,
    `subject` VARCHAR( 200 ) NOT NULL ,
    `content` TEXT NOT NULL ,
    PRIMARY KEY ( `id` )
    ) ENGINE = MYISAM CHARACTER SET utf8 COLLATE utf8_general_ci
    
    CREATE TABLE `test`.`article_1` (
    `id` BIGINT( 20 ) NOT NULL ,
    `subject` VARCHAR( 200 ) NOT NULL ,
    `content` TEXT NOT NULL ,
    PRIMARY KEY ( `id` )
    ) ENGINE = MYISAM CHARACTER SET utf8 COLLATE utf8_general_ci
    
    CREATE TABLE `test`.`article_2` (
    `id` BIGINT( 20 ) NOT NULL ,
    `subject` VARCHAR( 200 ) NOT NULL ,
    `content` TEXT NOT NULL ,
    PRIMARY KEY ( `id` )
    ) ENGINE = MYISAM CHARACTER SET utf8 COLLATE utf8_general_ci
    
    CREATE TABLE `test`.`article_3` (
    `id` BIGINT( 20 ) NOT NULL ,
    `subject` VARCHAR( 200 ) NOT NULL ,
    `content` TEXT NOT NULL ,
    PRIMARY KEY ( `id` )
    ) ENGINE = MYISAM CHARACTER SET utf8 COLLATE utf8_general_ci
    
    CREATE TABLE `test`.`article_4` (
    `id` BIGINT( 20 ) NOT NULL ,
    `subject` VARCHAR( 200 ) NOT NULL ,
    `content` TEXT NOT NULL ,
    PRIMARY KEY ( `id` )
    ) ENGINE = MYISAM CHARACTER SET utf8 COLLATE utf8_general_ci
    
    CREATE TABLE `test`.`article_5` (
    `id` BIGINT( 20 ) NOT NULL ,
    `subject` VARCHAR( 200 ) NOT NULL ,
    `content` TEXT NOT NULL ,
    PRIMARY KEY ( `id` )
    ) ENGINE = MYISAM CHARACTER SET utf8 COLLATE utf8_general_ci
    
    CREATE TABLE `test`.`article_6` (
    `id` BIGINT( 20 ) NOT NULL ,
    `subject` VARCHAR( 200 ) NOT NULL ,
    `content` TEXT NOT NULL ,
    PRIMARY KEY ( `id` )
    ) ENGINE = MYISAM CHARACTER SET utf8 COLLATE utf8_general_ci
    
    CREATE TABLE `test`.`article_7` (
    `id` BIGINT( 20 ) NOT NULL ,
    `subject` VARCHAR( 200 ) NOT NULL ,
    `content` TEXT NOT NULL ,
    PRIMARY KEY ( `id` )
    ) ENGINE = MYISAM CHARACTER SET utf8 COLLATE utf8_general_ci
    
    CREATE TABLE `test`.`article_8` (
    `id` BIGINT( 20 ) NOT NULL ,
    `subject` VARCHAR( 200 ) NOT NULL ,
    `content` TEXT NOT NULL ,
    PRIMARY KEY ( `id` )
    ) ENGINE = MYISAM CHARACTER SET utf8 COLLATE utf8_general_ci
    
    CREATE TABLE `test`.`article_9` (
    `id` BIGINT( 20 ) NOT NULL ,
    `subject` VARCHAR( 200 ) NOT NULL ,
    `content` TEXT NOT NULL ,
    PRIMARY KEY ( `id` )
    ) ENGINE = MYISAM CHARACTER SET utf8 COLLATE utf8_general_ci 

     好了10个表创建完毕了,需要注意的是,这里的id不能设为自增,而且所有的表结构必须一致,包括结构,类型,长度,字段的顺序都必须一致 那么对于这个id如何取得呢?后面我会详细说明。现在,我们需要一个合并表,用于查询,创建合并表的代码如下

    Sql代码
    1. CREATE   TABLE  `test`.`article` (  
    2. `id` BIGINT ( 20 )  NOT   NULL  ,  
    3. `subject` VARCHAR ( 200 )  NOT   NULL  ,  
    4. `content` TEXT NOT   NULL  ,  
    5. PRIMARY   KEY  ( `id` )  
    6. ) ENGINE=MRG_MyISAM DEFAULT  CHARSET=utf8 INSERT_METHOD=0  UNION =(`article_0`,`article_1`,`article_2`,`article_3`,`article_4`,`article_5`,`article_6`,`article_7`,`article_8`,`article_9`);   
    CREATE TABLE `test`.`article` (
    `id` BIGINT( 20 ) NOT NULL ,
    `subject` VARCHAR( 200 ) NOT NULL ,
    `content` TEXT NOT NULL ,
    PRIMARY KEY ( `id` )
    ) ENGINE=MRG_MyISAM DEFAULT CHARSET=utf8 INSERT_METHOD=0 UNION=(`article_0`,`article_1`,`article_2`,`article_3`,`article_4`,`article_5`,`article_6`,`article_7`,`article_8`,`article_9`); 

     这里INSERT_METHOD=0在某些版本可能不工作,需要改成INSERT_METHOD=NO
    注意,合并表也必须和前面的表有相同的结构,类型,长度,包括字段的顺序都必须一致 这里的INSERT_METHOD=0表示不允许对本表进行insert操作。好了,当需要查询的时候,我们可以只对article这个表进行操作就可以了,也就是说这个表仅仅只能进行select操作

    那么对于插入也就是insert操作应该如何来搞呢,首先就是获取唯一的id了,这里就还需要一个表来专门创建id,代码如下

    Java代码
    1. CREATE TABLE `test`.`create_id` (  
    2. `id` BIGINT( 20  ) NOT NULL AUTO_INCREMENT PRIMARY KEY  
    3. ) ENGINE = MYISAM   
    CREATE TABLE `test`.`create_id` (
    `id` BIGINT( 20 ) NOT NULL AUTO_INCREMENT PRIMARY KEY
    ) ENGINE = MYISAM 

     也就是说,当我们需要插入数据的时候,必须由这个表来产生id值,我的php代码的方法如下

    Java代码
      function get_AI_ID() {
          $sql  = "insert into create_id (id) values('')";
          $this->db->query($sql);
          return $this->db->insertID();
      } 

       好了,现在假设我们要插入一条数据了,应该怎么操作呢?还是继续看代码吧

      Java代码
        function new_Article() {
            $id  = $this->get_AI_ID();
            $table_name = $this->get_Table_Name($id);
            $sql = "insert into {$table_name} (id,subject,content) values('{$id}','测试标题','测试内容')";
            $this->db->query($sql);
        }
        /**
         * 用于根据id获取表名
         */
        function get_Table_Name($id) {
            return 'article_'.intval($id)%10;
        } 

         其实很简单的,对吧,就是先获取id,然后根据id获取应该插入到哪个表,然后就很简单了。

        对于update的操作我想应该不需要再说了吧,无非是有了id,然后获取表名,然后进行update操作就好了。

        0
        0
        分享到:
        评论

        相关推荐

          Node.js 实现的 MySQL 分表分库中间件,用于海量数据的分布式集群储存管理和高并发访问。.zip

          本文将深入探讨基于Node.js实现的MySQL分表分库中间件,它在分布式集群环境中起到至关重要的作用。 首先,Node.js是一种流行的JavaScript运行环境,它允许开发人员使用JavaScript进行服务器端编程。Node.js的异步非...

          mysql 分表

          关于mysql的分表技术实现方法。以及分表设计, 及简单的代码实例。

          MySQL 分库分表的实现原理及演示案例

          MySQL分库分表是一种数据库架构优化技术,其目的是为了提高大型数据库系统的性能和可扩展性。在面对大规模数据和高并发访问时,单库单表往往难以满足需求,分库分表就成为了必要之选。分库分表技术可以将数据分散...

          Python+MySQL分表分库实战

          "Python+MySQL分表分库实战"的主题,正是探讨如何结合这两者,以解决大数据存储和查询中的挑战。 分表分库,也称为数据库水平扩展,是应对海量数据的常用策略。当单个数据库表的数据量过大时,会导致查询效率降低,...

          mysql分表创建

          文件`mysql分表创建.sql`很可能包含了创建分表的SQL脚本,如创建新表、插入数据、设置分区等操作。具体操作时,应确保理解分表策略,合理选择分片键,避免数据热点,并测试分表后的查询性能。 总之,MySQL分表是...

          MySQL 分库分表的实现原理及演示案例.zip

          在"MySQL 分库分表的实现原理及演示案例.pdf"这个文档中,你可能会看到如何在实际环境中应用这些概念和工具的详细步骤,包括设置分片规则、配置分库分表中间件、处理分布式事务等。通过学习和实践这些案例,你将能够...

          Python与MySQL分表分库实战

          本篇文章将深入探讨"Python与MySQL分表分库实战"这一主题,帮助你理解如何有效地利用这两种技术来优化数据库性能和处理大数据。 首先,我们需要理解“分表分库”这一概念。随着数据量的增长,单一数据库可能会面临...

          PHP操作mysql数据库分表的方法_.docx

          这种方法是根据自增ID的尾数进行分表,通常适用于ID均匀分布的情况。例如,我们可以创建10个表,分别对应ID尾数为0到9的记录。在上述文档中,创建了名为`article_0`到`article_9`的10个表,每个表结构相同,都包含`...

          MySQL分表和分区的具体实现方法

          本文将详细介绍这两种技术及其在MySQL中的具体实现。 **垂直分表**是将一个宽表(包含大量列)拆分为多个窄表,每个新表包含一部分原表的列。例如,一个包含20个字段的表A可以拆分为表A1和A2,每个新表包含10个字段...

          Mysql分表查询,哈希,范围,列表

          【MySQL分表查询】在大型数据库系统中,随着数据量的不断增长,单表的数据规模可能会变得非常庞大,导致查询效率下降,系统性能受到影响。此时,分表技术就显得尤为重要。MySQL提供了多种分表策略,如哈希分表、范围...

          Python+MySQL分表分库实战 - v1.0 - 运维生存时间 -(2016).mobi

          Python后端运维工程师的可靠参考书,重点介绍如何优化mysql数据库性能。

          mycat+mysql+jdbc实现根据手机号尾号分库分表存储以及效率对比操作代码()

          标题中的“mycat+mysql+jdbc实现根据手机号尾号分库分表存储”涉及的是分布式数据库中间件Mycat与MySQL数据库以及Java JDBC接口的结合使用。Mycat是一款开源的分布式数据库系统,用于解决大数据量、高并发的场景下的...

          基于Mycat实现Mysql读写分离以及分库分表.doc

          基于Mycat实现Mysql读写分离以及分库分表详解 本文档详细介绍了基于Mycat实现Mysql读写分离以及分库分表的技术,涵盖了Mycat安装、配置、读写分离、分库分表等多方面的知识点。 一、读写分离 Mycat读写分离是指将...

          TP5+MySQL通用分表代码

          - 分表情况,2:日期分表,按照目标表里面的记录日期的字段,按照日期【日、周、月、年】拆分成多个表【本代码仅考虑unix时间戳来分表,其它不支持,您可以自己思考,自己修改代码】 - 注意,支持【子表】,填入...

          大数据表的分表处理设计思想和实现(MySQL)

          ### 四、分表实现 在MySQL中,可以使用以下方法实现分表: 1. **表分区(Partitioning)**:MySQL支持基于范围、列表、哈希和key的分区,直接在数据库层面上进行数据分布,简化了应用层的处理。 2. **数据库复制...

          mysql 分库分表查询工具-shard.zip

          MySQL 分库分表查询工具——Shard 在大型的互联网应用中,数据库的性能瓶颈往往成为系统扩展性的关键因素。为了应对高并发、大数据量的挑战,MySQL 数据库的分库分表策略被广泛采用。分库是将数据分散到多个独立的...

          php mysql分库分表实例

          "php mysql分库分表实例"这个主题就是针对这样的需求,它涉及到如何利用PHP编程语言来实现MySQL数据库的分库分表操作,以提高系统的性能和可扩展性。 分库分表是一种常见的数据库垂直切分和水平切分策略,用于解决...

          基于hibernate的mysql分表分库实例-mysql-cluster-hibernate.zip

          "基于hibernate的mysql分表分库实例-mysql-cluster-hibernate.zip"这个压缩包文件提供了一个具体的解决方案,它涉及到Hibernate ORM框架与MySQL数据库集群的整合,旨在处理高并发、大数据量的业务场景。 **...

          MySQL分库分表技术

          **MySQL分库分表技术** 随着互联网业务的快速发展,数据量呈现爆炸性增长,单个数据库的性能瓶颈问题日益突出。在这种背景下,MySQL的分库分表技术应运而生,旨在解决高并发、大数据量场景下的性能挑战。本篇将深入...

        Global site tag (gtag.js) - Google Analytics