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

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

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

  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如何取得呢?后面我会详细说明。现在,我们需要一个合并表,用于查询,创建合并表的代码如下

  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操作。好了,当需要查询的时候,我们可以只对article这个表进行操作就可以了,也就是说这个表仅仅只能进行select操作

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

  CREATE TABLE `test`.`create_id` (

  `id` BIGINT( 20 ) NOT NULL AUTO_INCREMENT PRIMARY KEY

  ) ENGINE = MYISAM

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

  function get_AI_ID() {

  $sql = "insert into create_id (id) values('')";

  $this->db->query($sql);

  return $this->db->insertID();

  }

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

  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操作就好了。

mysql myisam简单分表设计的更多相关文章

  1. 企业项目实战 .Net Core + Vue/Angular 分库分表日志系统二 | 简单的分库分表设计

    教程预览 01 | 前言 02 | 简单的分库分表设计 03 | 控制反转搭配简单业务 04 | 强化设计方案 05 | 完善业务自动创建数据库 06 | 最终篇-通过AOP自动连接数据库-完成日志业 ...

  2. php面试专题---mysql数据库分库分表

    php面试专题---mysql数据库分库分表 一.总结 一句话总结: 通过数据切分技术将一个大的MySQLServer切分成多个小的MySQLServer,既攻克了写入性能瓶颈问题,同一时候也再一次提 ...

  3. MySQL+MyCat分库分表 读写分离配置

    一. MySQL+MyCat分库分表 1 MyCat简介 java编写的数据库中间件 Mycat运行环境需要JDK. Mycat是中间件.运行在代码应用和MySQL数据库之间的应用. 前身 : cor ...

  4. MySQL之分库分表

    MySQL之分库分表(MyCAT实现)   分库分表介绍 随着微服务这种架构的兴起,我们应用从一个完整的大的应用,切分为很多可以独立提供服务的小应用.每个应用都有独立的数据库. 数据的切分分为两种: ...

  5. MySQL订单分库分表多维度查询

    转自:http://blog.itpub.net/29254281/viewspace-2086198/ MySQL订单分库分表多维度查询  MySQL分库分表,一般只能按照一个维度进行查询. 以订单 ...

  6. mysql status关键字 数据表设计中慎重使用

    mysql status关键字  数据表设计中慎重使用

  7. MySql分区、分表和分库

    MySql分区.分表和分库 数据库的数据量达到一定程度之后,为避免带来系统性能上的瓶颈.需要进行数据的处理,采用的手段是分区.分片.分库.分表. 一些问题的解释: 1.为什么要分表和分区? 日常开发中 ...

  8. 使用ShardingSphere-JDBC完成Mysql的分库分表和读写分离

    1. 概述 老话说的好:选择比努力更重要,如果选错了道路,就很难成功. 言归正传,之前我们聊了使用 MyCat 实现Mysql的分库分表和读写分离,MyCat是服务端的代理,使用MyCat的好处显而易 ...

  9. Mysql MyISAM与InnoDB 表锁行锁以及分库分表优化

    一. 两种存储引擎:MyISAM与InnoDB 区别与作用 1. count运算上的区别: 因为MyISAM缓存有表meta-data(行数等),因此在做COUNT(*)时对于一个结构很好的查询是不需 ...

随机推荐

  1. Play Framework 项目遇到问题

    1.Debug调试出错,提示: Error occurred during initialization of VMagent library failed to init: jdwpERROR: C ...

  2. MySQL 数据库通过日志恢复

    http://blog.csdn.net/hanxin1987216/article/details/5976856 要想从二进制日志恢复数据,你需要知道当前二进制日志文件的路径和文件名.一般可以从选 ...

  3. nandflash驱动程序编写

    NAND FLASH是一个存储芯片 那么: 这样的操作很合理"读地址A的数据,把数据B写到地址A" 问1. 原理图上NAND FLASH和S3C2440之间只有数据线, 怎么传输地 ...

  4. 排序算法----基数排序(RadixSort(L,max))单链表版本

    转载http://blog.csdn.net/Shayabean_/article/details/44885917博客 先说说基数排序的思想: 基数排序是非比较型的排序算法,其原理是将整数按位数切割 ...

  5. Dynamic Programming [Algorithm]

    今天学习动态规划01背包问题,从一篇非常不错的文章中学习甚多.转载于此,感谢作者的分享! 原文地址 通过金矿模型介绍动态规划 对于动态规划,每个刚接触的人都需要一段时间来理解,特别是第一次接触的时候总 ...

  6. [转载]fullPage.js中文api 配置参数~

    fullPage.js中文api 配置参数 选项 类型 默认值 说明 verticalCentered 字符串 true 内容是否垂直居中 resize 布尔值 false 字体是否随着窗口缩放而缩放 ...

  7. Python mock

    在测试过程中,为了更好地展开单元测试,mock一些数据跟对象在所难免,下面讲一下python的mock的简单用法. 关于python mock,网上有很多资料,这里不会讲的特别深,但一定会是实用为主, ...

  8. webstorm对WebGL自动提示

    默认竟然没有勾选上,怪不得提示的时候,有很多webgl接口找不到方法(虽然可以运行).

  9. 2016 daily

    2016.01.06 leetcode 切题数达到 200+,截止目前 137.虽然一年 63 题看似不多,但是 easy 的题目基本已经切完,质量 >> 数量(专注 leetcode,可 ...

  10. mybatis多对一关联

    mybatis多对一关联查询实现 1.定义实体 定义实体的时候需要注意,若是双向关联,就是说双方的属性中都含有对方对象作为域属性出现, 那么在写toString()方法时需要注意,只让某一方输出即可, ...