一般来说,当我们的数据库的数据超过了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_METHOD=NO
注意,合并表也必须和前面的表有相同的结构,类型,长度,包括字段的顺序都必须一致这里的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分库分表实例-Sub-LibriryTable"。 1. 分库分表概念: - 分库:将一个数据库拆分为多个数据库,每个数据库负责一部分数据,减少单个数据库的压力。 - 分表:将一张大表按照...
MySQL 分库分表是一种数据库扩展策略,用于解决大数据量下的性能瓶颈问题。在单个数据库无法满足高并发、大数据处理需求时,通过将数据分散到多个数据库实例中,实现水平扩展,提高系统的处理能力和可用性。`mysql-...
"基于hibernate的mysql分表分库实例-mysql-cluster-hibernate.zip"这个压缩包文件提供了一个具体的解决方案,它涉及到Hibernate ORM框架与MySQL数据库集群的整合,旨在处理高并发、大数据量的业务场景。 **...
标题"mycat对mysql数据库进行分库分表demo-mycat-demo-parent.zip"揭示了本示例主要围绕MyCat这一中间件,用于MySQL数据库的分布式处理,特别是分库分表功能。MyCat是一个开源的分布式数据库系统,它能够将一个大型...
总之,"springboot + mybatis+mysql+shareding-jdbc分库分表实"项目旨在展示如何利用SpringBoot、MyBatis和Sharding-JDBC在MySQL上实现数据库的分库分表,提高系统的并发处理能力和数据存储能力。通过理解和实践这个...
MySQL分表及分表后插入sql语句,表为订单表,可以参考一下
MySQL数据库在处理大数据量时,性能可能会受到挑战,此时就需要采用分库分表策略来提升系统性能。Sharding-JDBC是阿里巴巴开源的一款轻量级Java框架,它可以在不修改现有业务代码的情况下,实现数据的分布式处理。这...
"Mysql分表分库-core-dbshard2.zip" 文件可能包含了一个名为 "core-dbshard2-master" 的项目,这个项目很可能是关于MySQL数据库分库分表的实现方案或工具。 分库分表是一种水平扩展(Scaling Out)的方式,当单个...
在这个名为"MySQL分库分表演示-sharding-jdbc-demo"的项目中,我们将学习如何使用Sharding-JDBC来实现数据库的分库分表。首先,我们需要了解Sharding-JDBC的核心概念: 1. **分片规则**:定义了数据如何被分片到...
类似商品和服务区分表--基于尼斯分类第十一版 《类似商品和服务区分表--基于尼斯分类第十一版》(2018文本)是一份关于商品和服务的分类标准文档,旨在帮助企业和个人更好地了解和区分不同种类的商品和服务。该文档...
(2018版本)类似商品和服务区分表--基于尼斯分类第十一版
"MySQL数据库分表批量主键查询代理-mysql-partitions-proxy"项目就是为了应对这一挑战而设计的。这个开源工具旨在优化数据库的查询效率,尤其在面对分表场景下的主键批量查询时,它能提供一个代理服务,有效地协调和...
本项目"基于jdbcDriver的MySQL分库分表实现-OShard.zip"提供了使用Java JDBC驱动来实现MySQL数据库分库分表的示例。下面将详细阐述相关知识点。 1. **MySQL数据库**:MySQL是一款开源、免费的关系型数据库管理系统...
sql-分库分表 sql-分库分表
"mysql分库分表中间件-candice.zip"提供的正是这样一种解决方案,名为Candice。 Candice是一个针对MySQL的分布式数据库中间件,它的设计目标是提供透明的数据分片功能,使应用无需修改代码就能享受到分库分表带来的...
### 数据库技术与应用专场——58同城MySQL分库分表实践 #### 一、基本概念 在数据库领域,为了应对大数据量所带来的挑战,通常会采用分库分表的技术手段来提升系统的整体性能和可扩展性。以下是几个关键概念: - ...
(2018版本)类似商品和服务区分表--基于尼斯分类第十一版.doc
总之,"数据库mysql分库分表-spring-boot-shardingjdbc"项目展示了如何使用Spring Boot和ShardingJDBC来解决大数据量下的数据库性能问题。通过学习和实践这个项目,开发者不仅可以掌握数据库分片的基本原理,还能...
本文将深入探讨基于Node.js实现的MySQL分表分库中间件,它在分布式集群环境中起到至关重要的作用。 首先,Node.js是一种流行的JavaScript运行环境,它允许开发人员使用JavaScript进行服务器端编程。Node.js的异步非...
19、深入理解ShardingProxy服务端分库分表_ev.rar19、深入理解ShardingProxy服务端分库分表_ev.rar19、深入理解ShardingProxy服务端分库分表_ev.rar19、深入理解ShardingProxy服务端分库分表_ev.rar19、深入理解...