一般来说,当我们的数据库的数据超过了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. 原创 C++作用域 (一)

    1概述 在所有的计算机程序中,一个基本的目标是操作一些数据,然后获得一些结果.为了操作这些数据,需要为这些数据分配一段内存,我们可以将这段内存称为变量.为了方便操作,以及程序可读性方面的考虑,需要使用 ...

  2. MySql提示:The server quit without updating PID file(…)失败

    一般有一下集中可能 1.可能是/usr/local/mysql/data/rekfan.pid文件没有写的权限解决方法 :给予权限,执行 "chown -R mysql:mysql /var ...

  3. nginx 安全优化

    http://nginx.org/en/docs/http/ngx_http_access_module.html  官网 1.允许特定的ip访问,拒绝特定ip server { listen 80; ...

  4. 《Ansible权威指南》笔记(1)——安装,ssh密钥登陆,命令

    2016-12-23 读这本<Ansible权威指南>学习ansible,根据本书内容和网上的各种文档,以及经过自己测试,写出以下笔记.另,这本书内容很好,但印刷错误比较多,作者说第二版会 ...

  5. WPF DevExpress 设置雷达图Radar样式

      DevExpress中定义的ChartControl很不错,很多项目直接使用这种控件. 本节讲述雷达图的样式设置 <Grid> <Grid.Resources> <D ...

  6. Markdown简介以及常用语法

    Markdown简介以及常用语法 最近发现用markdown记录东西很方便,感觉和emacs的org mode很类似,但是windows下使用emacs不是很方便.特此记录一下markdown常用的语 ...

  7. BZOJ 1984: 月下“毛景树” [树链剖分 边权]

    1984: 月下“毛景树” Time Limit: 20 Sec  Memory Limit: 64 MBSubmit: 1728  Solved: 531[Submit][Status][Discu ...

  8. angular学习笔记(二十八-附2)-$http,$resource中的promise对象

    下面这种promise的用法,我从第一篇$http笔记到$resource笔记中,一直都有用到: HttpREST.factory('cardResource',function($resource) ...

  9. MVC 数据验证

    MVC 数据验证 前一篇说了MVC数据验证的例子,这次来详细说说各种各样的验证注解.System.ComponentModel.DataAnnotations 一.基础特性 一.Required 必填 ...

  10. webstorm对WebGL自动提示

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