一般来说,当我们的数据库的数据超过了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. 简历生成平台项目开发-STEP4第二次项目例会讨论

    时间:2016.7.15周五7点半 地点:图书馆 讨论主题:交流各自手头项目进展,确定下一步任务 内容:按照之前的讨论的任务大家各自汇报进度. 汇报人:谭卓.尹忠诚 内容:1.基于富文本编辑器的模板, ...

  2. [MySQL Reference Manual] 24 MySQL sys框架

    24 MySQL sys框架 24 MySQL sys框架 24.1 sys框架的前提条件 24.2 使用sys框架 24.3 sys框架进度报告 24.4 sys框架的对象 24.4.1所有sys下 ...

  3. uploadify插件Http Error(302)错误记录(MVC)

    由于项目(asp.net MVC)需要做一个附件上传的功能,使用的是jQuery的Uploadify插件的2.1.0版本,上传文件到自己项目指定的文件夹下面.做完之后,在谷歌上测试是正确的,在火狐上报 ...

  4. apachetop 实时监测web服务器运行状况

    apachetop 实时监测web服务器运行状况   我们经常会需要知道服务器的实时监测服务器的运行状况,比如哪些 URL 的访问量最大,服务器每秒的请求数,哪个搜索引擎正在抓取我们网站?面对这些问题 ...

  5. python 进度条的编写

    背景: 在执行一些Python脚本时,经常出现执行脚本的过程当中,不知道脚本执行了百分之多少,这个问题一直都让我很苦恼.所以特意总结一下,进度条的编写. #!/usr/bin/env python2. ...

  6. CentOS中的环境变量配置文件

    CentOS的环境变量配置文件体系是一个层级体系,这与其他多用户应用系统配置文件是类似的,有全局的,有用户的,有shell的,另外不同层级有时类似继承关系.下面以PATH变量为例. 1.修改/etc/ ...

  7. 萌新笔记——Cardinality Estimation算法学习(二)(Linear Counting算法、最大似然估计(MLE))

    在上篇,我了解了基数的基本概念,现在进入Linear Counting算法的学习. 理解颇浅,还请大神指点! http://blog.codinglabs.org/articles/algorithm ...

  8. My first win32 application program

    #include<afxwin.h>#include<afx.h>#define _AFXDLLclass CHelloApp :public CWinApp{public:  ...

  9. 从BSP模型到Apache Hama

    一.什么是BSP模型 概述 BSP(Bulk Synchronous Parallel,整体同步并行计算模型)是一种并行计算模型,由英国计算机科学家Viliant在上世纪80年代提出.Google发布 ...

  10. 东软HIS切换输入法卡死的解决方法

    在文字选项的第二页上,勾选上边的相容性设定,然后重启电脑: