一般来说,当我们的数据库的数据超过了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操作就好了。
ok,今天就到这里了。
相关推荐
本文将深入探讨基于Node.js实现的MySQL分表分库中间件,它在分布式集群环境中起到至关重要的作用。 首先,Node.js是一种流行的JavaScript运行环境,它允许开发人员使用JavaScript进行服务器端编程。Node.js的异步非...
MySQL分库分表是数据库架构设计...通过本实战教程的学习,读者将能够掌握MySQL分库分表的理论知识和实践操作技能,进一步提升自己在数据库架构设计和运维方面的能力,为处理大规模应用的高并发场景提供有力的技术支持。
本篇文章将深入探讨"Python与MySQL分表分库实战"这一主题,帮助你理解如何有效地利用这两种技术来优化数据库性能和处理大数据。 首先,我们需要理解“分表分库”这一概念。随着数据量的增长,单一数据库可能会面临...
总之,MySQL分表是应对大数据挑战的有效手段,它涉及到数据库设计、性能优化等多个方面。通过合理分表,不仅可以提高查询速度,还能改善系统的可扩展性和可用性。在实际应用中,结合源码和工具,可以根据业务需求...
为了解决这一问题,分表设计成为了数据库优化的重要手段。分表能够有效地分散数据库的压力,提高查询速度,并简化维护工作。 ### 一、为什么要分表? 1. **性能提升**:大型表在执行SQL时,由于数据量大,索引扫描...
【MySQL分表查询】在大型数据库系统中,随着数据量的不断增长,单表的数据规模可能会变得非常庞大,导致查询效率下降,系统性能受到影响。此时,分表技术就显得尤为重要。MySQL提供了多种分表策略,如哈希分表、范围...
总的来说,MySQL的分表分库是一个深度优化数据库性能的重要手段,但需要根据具体业务需求和资源限制,谨慎选择合适的设计方式和策略。在实施过程中,需要全面考虑数据分布、查询效率、事务处理和运维成本等因素,以...
总结,MySQL的分库分表技术是应对大数据量和高并发场景的重要手段,它通过合理的设计和策略,能够有效地提升系统的扩展性和性能,但同时也带来了数据一致性和运维复杂性的挑战。实践中需要根据业务特性选择合适的分...
而 shard.zip 文件中包含的 "shard" 工具,正是为了帮助开发者在分库分表的环境中进行高效查询而设计的。 Shard 工具的核心功能在于提供了一种方式来管理和协调跨多个数据库和表的查询。它通过特定的路由规则,将...
在IT行业中,数据库管理是至关重要的,特别是在处理大数据量时。...通过合理的设计和实现,可以显著提高数据库性能,降低单表压力,为应用提供更好的支撑。在实践中,要不断优化和调整策略,以适应不断变化的业务需求。
总而言之,MySQL分库分表技术是处理大规模数据存储与访问的重要手段,对于提高系统的性能、扩展性和维护性有着非常积极的作用。掌握分库分表技术,不仅需要了解理论知识,还需要通过实际案例来加深理解,只有通过...
### MySQL分区分表的设计及实现 #### 一、引言 随着信息技术的飞速发展,数据量呈现爆炸式增长,海量数据的管理和处理成为了一项挑战。尤其在关系型数据库中,如MySQL这样的系统,当单个表的数据量达到一定规模后...
MySQL 分库分表设计和实现 MySQL 中的分库分表是一种常用的数据库扩展方式,可以提高数据库的并发处理能力和扩展性。分库分表的设计和实现需要遵循一定的步骤和原则,以下是分库分表的设计和实现的一般步骤: ...
垂直分表针对的是字段的访问频率,比如将访问频繁的字段与偶尔访问的字段分开存储。通常,访问频率高且数据量小的字段继续保留在原表中,而长度较大、访问频次低的字段则单独成表。垂直分表的好处在于可以针对不同的...
"Mysql分表分库-core-dbshard2.zip" 文件可能包含了一个名为 "core-dbshard2-master" 的项目,这个项目很可能是关于MySQL数据库分库分表的实现方案或工具。 分库分表是一种水平扩展(Scaling Out)的方式,当单个...
在大型互联网应用中,随着用户数量和数据规模的增长,单个数据库可能无法承受大量的读写操作,这时就需要采取分表分库的方式来提高系统性能。 **一、分表(Sharding)** 分表是指将一个大表按照一定的规则划分为多...
本文将深入探讨如何使用MySQL分表实现大规模数据的分布存储和批量查询设计模式。 首先,我们需要理解分表的概念。不同于MySQL 5.1引入的分区(Partitioning)功能,这里所说的分表是手动将一个大表根据特定字段(如...
在"MySQL 分库分表的实现原理及演示案例.pdf"这个文档中,你可能会看到如何在实际环境中应用这些概念和工具的详细步骤,包括设置分片规则、配置分库分表中间件、处理分布式事务等。通过学习和实践这些案例,你将能够...
MySQL的分表和分区是数据库管理中两种...总的来说,分表和分区是数据库设计中的重要手段,它们可以帮助我们管理和优化大规模数据,提高数据库系统的整体性能。选择哪种策略取决于具体的应用场景、数据规模和业务需求。