mysql分表场景分析与简单分表操作
- 格式:pdf
- 大小:152.09 KB
- 文档页数:4
mysql的分区和分表分区分区就是把⼀个数据表的⽂件和索引分散存储在不同的物理⽂件中。
mysql⽀持的分区类型包括Range、List、Hash、Key,其中Range⽐较常⽤:RANGE分区:基于属于⼀个给定连续区间的列值,把多⾏分配给分区。
LIST分区:类似于按RANGE分区,区别在于LIST分区是基于列值匹配⼀个离散值集合中的某个值来进⾏选择。
HASH分区:基于⽤户定义的表达式的返回值来进⾏选择的分区,该表达式使⽤将要插⼊到表中的这些⾏的列值进⾏计算。
这个函数可以包含MySQL 中有效的、产⽣⾮负整数值的任何表达式。
KEY分区:类似于按HASH分区,区别在于KEY分区只⽀持计算⼀列或多列,且MySQL服务器提供其⾃⾝的哈希函数。
必须有⼀列或多列包含整数值。
案例:建⽴⼀个user 表以id进⾏分区 id ⼩于10的在user_1分区id⼩于20的在user_2分区create table user(id int not null auto_increment,username varchar(10),primary key(id))engine = innodb charset=utf8partition by range (id)(partition user_1 values less than (10),partition user_2 values less than (20));建⽴后添加分区:maxvalue 表⽰最⼤值这样⼤于等于20的id 都出存储在user_3分区alter table user add partition(partition user_3 values less than maxvalue);删除分区:alter table user drop partition user_3;现在打开mysql的数据⽬录可以看见多了user#P#user_1.ibd 和user#P#user_2.ibd 这两个⽂件如果表使⽤的存储引擎是MyISAM类型,就是:user#P#user_1.MYD,user#P#user_1.MYI和user#P#user_2.MYD,user#P#user_2.MYI由此可见,mysql通过分区把数据保存到不同的⽂件⾥,同时索引也是分区的。
MySQL中的数据库分库分表和水平拆分方案推荐随着互联网的迅猛发展,数据量的剧增对数据库存储和访问提出了更高的要求。
在此背景下,数据库分库分表和水平拆分成为了解决大数据存储和查询性能瓶颈的有效方案。
本文将介绍MySQL中的数据库分库分表和水平拆分,并推荐一些方案供参考。
一、数据库分库分表的概念和原因数据库分库分表是指将一个大的数据库分割成多个小的数据库,将一个大的表分割成多个小的表,从而实现数据的分布式存储和查询。
其主要原因有以下几点:1. 数据量过大:当数据库中的数据量超过单台服务器的存储和处理能力时,分库分表可以将数据均匀地分布在多个服务器上,提高存储和查询性能。
2. 单表查询性能瓶颈:当某个表的数据量过大,导致查询性能下降时,可以通过分表的方式将数据水平拆分,使得每个表的数据量减少,从而提高查询性能。
3. 业务隔离和数据安全:分库分表可以根据业务需求将不同的业务数据分别存储在不同的库和表中,提高业务隔离性和数据安全性。
二、数据库分库分表的方案在MySQL中实现数据库分库分表可以采用多种方案,下面将分别介绍。
1. 垂直分库和垂直分表垂直分库是指将不同业务之间的数据存储在不同的数据库中,每个数据库只存储特定的业务数据。
这样可以有效实现业务隔离和数据安全。
垂直分表是指将一个大的表按照字段的不同进行拆分,不同的字段存储在不同的表中。
这样可以提高查询性能,根据业务需求只查询需要的字段。
2. 水平分库和水平分表水平分库是指将一个大的数据库按照数据的某种规则进行拆分,将数据均匀地存储在多个数据库中。
常用的拆分规则有按照ID范围、按照哈希值等。
水平分表是指将一个大的表按照某个字段的值进行拆分,将数据均匀地存储在多个表中。
常用的拆分规则有按照ID范围、按照年份、按照地域等。
3. 分库分表的中间件为了方便管理和使用分库分表的数据,可以采用分库分表的中间件,例如ShardingSphere、MyCAT等。
这些中间件可以对数据进行路由、分片等操作,使得应用程序无需关注具体的分库分表细节,提高开发效率。
【转】mysql分库分表,数据库分库分表思路原⽂:同类参考:⼀. 数据切分关系型数据库本⾝⽐较容易成为系统瓶颈,单机存储容量、连接数、处理能⼒都有限。
当单表的数据量达到1000W或100G以后,由于查询维度较多,即使添加从库、优化索引,做很多操作时性能仍下降严重。
此时就要考虑对其进⾏切分了,切分的⽬的就在于减少数据库的负担,缩短查询时间。
数据库分布式核⼼内容⽆⾮就是数据切分(Sharding),以及切分后对数据的定位、整合。
数据切分就是将数据分散存储到多个数据库中,使得单⼀数据库中的数据量变⼩,通过扩充主机的数量缓解单⼀数据库的性能问题,从⽽达到提升数据库操作性能的⽬的。
数据切分根据其切分类型,可以分为两种⽅式:垂直(纵向)切分和⽔平(横向)切分1、垂直(纵向)切分垂直切分常见有垂直分库和垂直分表两种。
垂直分库就是根据业务耦合性,将关联度低的不同表存储在不同的数据库。
做法与⼤系统拆分为多个⼩系统类似,按业务分类进⾏独⽴划分。
与"微服务治理"的做法相似,每个微服务使⽤单独的⼀个数据库。
如图:垂直分表是基于数据库中的"列"进⾏,某个表字段较多,可以新建⼀张扩展表,将不经常⽤或字段长度较⼤的字段拆分出去到扩展表中。
在字段很多的情况下(例如⼀个⼤表有100多个字段),通过"⼤表拆⼩表",更便于开发与维护,也能避免跨页问题,MySQL底层是通过数据页存储的,⼀条记录占⽤空间过⼤会导致跨页,造成额外的性能开销。
另外数据库以⾏为单位将数据加载到内存中,这样表中字段长度较短且访问频率较⾼,内存能加载更多的数据,命中率更⾼,减少了磁盘IO,从⽽提升了数据库性能。
垂直切分的优点:解决业务系统层⾯的耦合,业务清晰与微服务的治理类似,也能对不同业务的数据进⾏分级管理、维护、监控、扩展等⾼并发场景下,垂直切分⼀定程度的提升IO、数据库连接数、单机硬件资源的瓶颈缺点:部分表⽆法join,只能通过接⼝聚合⽅式解决,提升了开发的复杂度分布式事务处理复杂依然存在单表数据量过⼤的问题(需要⽔平切分)2、⽔平(横向)切分当⼀个应⽤难以再细粒度的垂直切分,或切分后数据量⾏数巨⼤,存在单库读写、存储性能瓶颈,这时候就需要进⾏⽔平切分了。
MySQL数据库的数据分片与分表策略分析随着互联网时代的到来,数据量的爆炸式增长已经成为了大数据时代的新常态。
对于企业来说,如何高效地管理和处理海量的数据成为了一项重大挑战。
在这样的背景下,数据库的设计和优化就显得尤为重要。
MySQL作为一种常用的数据库管理系统,在数据分片和分表方面具有良好的支持和应用。
针对MySQL数据库的数据分片和分表策略,本文将进行详细分析和探讨。
一、数据分片策略1. 数据分片的概念和目的数据分片是指将一个大型数据库分成多个小型数据库,每个小型数据库负责存储和处理部分数据。
数据分片的主要目的是提高数据库的性能和可用性。
通过将数据分散存储在多个计算节点上,可以减轻单个节点的负载压力,并且提供更高的并发能力。
2. 数据分片的原则在进行数据分片时,需要遵循以下几个原则:(1)分片策略应根据业务需求制定。
不同的业务场景对数据的需求是不同的,因此在进行数据分片时,需要根据具体的业务需求来制定分片策略。
例如,可以根据用户ID进行分片,以保证同一用户的数据存储在同一个分片上,便于查询和操作。
(2)分片策略应均衡负载。
在进行数据分片时,应尽量保证每个分片的负载均衡,避免出现某个分片负载过高,而其他分片负载过低的情况。
这需要通过合理的数据分片算法和动态的负载均衡机制来实现。
(3)分片策略应考虑可扩展性。
随着业务的扩张,数据量也会不断增加,因此分片策略应具备良好的可扩展性。
即在未来需要扩展时,能够方便地增加新的分片,并且不会影响已有的数据和业务。
3. 数据分片的方法在MySQL中,常用的数据分片方法有水平分片和垂直分片两种。
(1)水平分片水平分片是指将表的数据按照某种规则分散存储在多个分片中。
常用的水平分片策略包括基于范围、基于模数、基于哈希等。
例如,可以根据用户ID的范围将数据分散存储在不同的分片上。
水平分片的优点是可以有效地减少单个分片的数据量,提高查询和操作的性能。
但是,水平分片也会增加数据的管理和维护难度,例如需要对全局唯一数据进行处理时需要特殊处理。
MySQL优化--分区、分表、分库为什么要分表和分区?⽇常开发中我们经常会遇到⼤表的情况,所谓的⼤表是指存储了百万级乃⾄千万级条记录的表。
这样的表过于庞⼤,导致数据库在查询和插⼊的时候耗时太长,性能低下,如果涉及联合查询的情况,性能会更加糟糕。
分表和表分区的⽬的就是减少数据库的负担,提⾼数据库的效率,通常点来讲就是提⾼表的增删改查效率。
什么是分表?分表是将⼀个⼤表按照⼀定的规则分解成多张具有独⽴存储空间的实体表,我们可以称为⼦表,每个表都对应三个⽂件,MYD数据⽂件,.MYI索引⽂件,.frm表结构⽂件。
这些⼦表可以分布在同⼀块磁盘上,也可以在不同的机器上。
app读写的时候根据事先定义好的规则得到对应的⼦表名,然后去操作它。
什么是分区?分区和分表相似,都是按照规则分解表。
不同在于分表将⼤表分解为若⼲个独⽴的实体表,⽽分区是将数据分段划分在多个位置存放,可以是同⼀块磁盘也可以在不同的机器。
分区后,表⾯上还是⼀张表,但数据散列到多个位置了。
app读写的时候操作的还是⼤表名字,db⾃动去组织分区的数据。
分表和分区⽐较分区⽐较简单,由数据库⾃⾝维护数据关系。
分表⽐分区更复杂,但是性能稍微好⼀点点。
但分表会造成业务代码更复杂,要通过代码指定数据存储到特定的表。
错误的分表操作,容易引发其他问题数据库分库(物理层⾯进⾏拆分)跨库Join的问题,虽然可以通过基础表多数据库同步复制来解决,但也增加了复杂度。
不同业务的拆分:编程复杂(根据业务选择对应的数据库),做关联业务联级操作的时候,有分布式事务的问题。
同⼀类业务的拆分:编程复杂,尤其在涉及到复杂业务查询时,有可能需要多库多次查询,然后进⾏结果集合并。
MySQL 分区、分表、分库1. 分区、分表、分库都可以⼤幅提升数据库读的性能。
2. 数据库分库可以提升并发写的速度:通过简单的hash取余、⽇期时间、或业务区域等等,来拆分同⼀类业务数据(如订单数据)。
或者通过不同业务领域,来拆分不同业务数据(商品、客户、订单、采购等等)。
如何使用MySQL实现数据分库和分表MySQL是一种流行的关系型数据库管理系统,在大型应用程序中,数据量可能巨大,这时就需要考虑使用数据分库和分表来提高性能和扩展性。
本文将介绍如何使用MySQL来实现数据分库和分表的技巧和最佳实践。
1. 数据分库和分表的概念数据分库(Sharding)是指将一个大型数据库分成多个独立的数据库,每个数据库拥有独立的数据和索引。
数据分表(Partitioning)是指将一个大型表分成多个子表,每个子表拥有一部分数据和索引。
数据分库和分表的目的是提高系统性能和扩展性。
通过将数据和负载分散到多个数据库和表中,可以减轻数据库服务器的压力,提高查询和写入性能,并且方便水平扩展。
2. 数据分库的策略在进行数据分库之前,需要确定合适的分库策略。
以下是几种常用的分库策略:- 基于表进行分库:根据不同的业务表将数据分配到不同的数据库中。
例如,将用户相关的数据存储在一个数据库中,将订单相关的数据存储在另一个数据库中。
- 基于字段进行分库:根据某个字段的取值将数据分配到不同的数据库中。
例如,根据用户ID的奇偶性将数据分配到不同的数据库中。
- 基于哈希进行分库:根据数据的哈希值将数据分配到不同的数据库中。
这种策略可以均匀地分散数据到不同的数据库中,避免热点数据的问题。
- 基于地理位置进行分库:根据数据所属的地理位置将数据分配到不同的数据库中。
这种策略适用于需要根据地理位置进行查询的应用场景。
选择合适的分库策略需要根据具体的业务需求和系统特点进行评估和选择。
3. 数据分表的策略在进行数据分表之前,需要确定合适的分表策略。
以下是几种常用的分表策略:- 基于范围进行分表:根据某个字段的范围将数据分配到不同的子表中。
例如,将订单表按照时间范围分为不同的子表,如订单2020年子表、订单2021年子表等。
- 基于哈希进行分表:根据数据的哈希值将数据分配到不同的子表中。
这种策略可以均匀地分散数据到不同的子表中,避免单个表数据量过大的问题。
如何使用MySQL进行分表和分库管理随着互联网的飞速发展和数据量的快速增长,数据库管理已经成为了每个开发人员和数据工程师必须面对和解决的问题。
而MySQL作为一款常用的关系型数据库管理系统,它的表现优异和稳定性使得它成为了众多企业和项目的首选。
然而,当数据规模庞大时,如何进行有效的分表和分库管理就成为了亟待解决的课题。
分表和分库管理是一种将数据分布在多个表或多个数据库中的技术,可以有效地提升数据库的性能和扩展性。
下面我将介绍一些常见的分表和分库技术,以及在使用MySQL进行分表和分库管理时一些注意事项和优化策略。
一、分表管理1. 垂直切分垂直切分是将不同的字段划分到不同的表中,可以根据字段的使用频率或者数据冗余程度来进行划分。
对于宽表来说,可以将稀疏和频繁变更的字段拆分到独立的表中,从而降低了大表的访问和更新的开销。
垂直切分可以提高查询性能和减少数据维护的工作量。
2. 水平切分水平切分是将同一个表的数据划分到多个表中,通常是将按照某个字段进行划分,比如按照用户ID或者时间范围进行划分。
水平切分可以有效地提升数据库的性能和扩展性,减小了单个表的数据量,从而减少了磁盘IO和网络传输的开销。
3. 范围切分范围切分是根据某个字段的范围将数据划分到多个表中,比如按照时间范围进行划分。
范围切分可以提高查询性能,将数据分布在多个表中可以实现更快的查询响应时间。
二、分库管理分库管理是将数据分布在多个数据库中,每个数据库可以独立管理和部署。
分库可以提高数据库的扩展性和并发性,对于大型企业和项目来说,分库是一个必然的选择。
1. 垂直分库垂直分库是按照业务功能将数据分布到不同的数据库中,比如将用户相关的数据存放到一个数据库,将商品相关的数据存放到另一个数据库。
垂直分库可以实现业务解耦和高并发访问。
2. 横向分库横向分库是将同一张表的不同数据划分到多个数据库中,比如将按照用户ID 取模的方式将数据划分到多个数据库中。
横向分库可以提高数据库的并发性和水平扩展性。
MySQL中的表分区和分表策略选择引言:MySQL是一种常用的关系型数据库管理系统(RDBMS),用于存储和管理大量的结构化数据。
随着数据量的不断增长,优化数据库性能成为开发人员和数据库管理员关注的重点。
其中,表分区和分表策略是一种常见的优化手段,通过将数据分散存储在多个物理文件中,有效地减轻了数据库的负载。
一、表分区表分区是一种将单个表分割成多个逻辑和物理部分的技术。
每个分区可以独立进行维护,查询和备份,从而提高数据库性能和可用性。
1.1 分区类型MySQL支持多种类型的表分区,包括范围分区、列表分区、哈希分区和键值分区。
这些分区类型可以根据具体的需求进行选择。
- 范围分区:根据某个范围值,如日期或数字范围,将数据分布到不同分区中。
这种分区类型适合按照时间或数字进行检索和查询的场景,如按月份分区的日志表。
- 列表分区:根据预定义的列表值,将数据分布到不同分区中。
这种分区类型适用于按照某一列的具体值进行查询的场景,如按照地区分区的订单表。
- 哈希分区:根据某个列的哈希值,将数据分布到不同分区中。
这种分区类型适用于均匀分布数据的场景,如用户ID分布均匀的用户信息表。
- 键值分区:根据某个列的键值,将数据分布到不同分区中。
这种分区类型适用于基于键值进行查询的场景,如按照用户ID分区的订单表。
1.2 分区优势表分区在提高数据库性能和可用性方面具有一定的优势:- 查询性能提升:根据查询的特点,可以仅对特定的分区进行检索,减少了全表扫描的开销,从而提高了查询的性能。
- 数据维护方便:对于特定的分区,可以进行独立的数据插入、更新和删除操作,而无需对整个表进行操作,简化了数据维护的过程。
- 故障容错能力提高:当某个分区发生故障时,其他正常分区的数据仍然可用,提高了整个数据库的可用性。
二、表分表表分表是一种将单个表分割成多个物理表的技术。
每个表独立存储一部分数据,通过一定的规则,如根据哈希值或范围值,将数据均匀地分配到不同的表中。
MySQL数据库的分库分表方案与实现在当今互联网时代,大数据的处理成为了互联网企业面临的重要挑战之一。
随着用户量的不断增加和业务的快速发展,原本单一的数据库无法满足高并发和大容量的需求。
为了提高数据库的性能和扩展能力,分库分表成为了解决方案之一。
一、分库分表的概念和原理分库分表是将一个大的数据库划分为多个小的数据库,将一个大的数据表划分为多个小的数据表,将数据分散到多个数据库或数据表中进行存储和查询。
通过这种方式,可以减少单个数据库或数据表的负载,提高数据库的并发处理能力和性能。
在进行分库分表之前,首先需要对数据库进行建模和设计。
需要考虑的因素包括数据表的字段和索引的设计、数据表之间的关联关系、数据访问的频率和模式等等。
在设计之后,可以根据业务的情况来选择合适的分库分表策略。
分库分表的策略包括垂直分表和水平分表。
1. 垂直分表:将一个大的数据表按照字段的关联性进行拆分,将关联度低的字段拆分到不同的数据表中。
例如,将用户表中的基本信息和个人信息拆分到不同的数据表中。
这样可以减少单个数据表的字段数量,提高查询效率。
2. 水平分表:将一个大的数据表按照数据行进行拆分,将数据行拆分到不同的数据表中。
例如,按照用户的地域或者用户ID进行拆分,将不同地区或者不同用户ID的数据存储到不同的数据表中。
这样可以减少单个数据表的数据量,提高查询效率。
二、分库分表的实现方案在MySQL中,可以通过多种方式来实现分库分表。
下面介绍几种常用的分库分表实现方案。
1. 垂直分表方案:(1)数据库代理:通过数据库代理软件,将数据查询和写入操作路由到不同的数据库中。
常用的数据库代理软件有MySQL Proxy和MaxScale等。
(2)视图和触发器:通过创建视图和触发器来实现数据的拆分和整合。
例如,将用户表按照垂直分表的方式拆分成多个数据表,在不同的数据表中存储不同的字段,然后通过视图和触发器来实现数据的查询和写入。
2. 水平分表方案:(1)分区表:MySQL提供了分区表的功能,可以将一个大的数据表按照某个字段进行拆分,每个分区存储一部分数据。
mysql分表方法MySQL分表是数据库优化的常用技术,主要用于解决单一表数据量过大导致查询性能下降的问题。
以下是几种常见的MySQL分表方法:1. 水平分表:按照某个字段的值将数据分散到多个表中。
例如,一个用户表可以根据用户ID的范围进行分表,如`user1`, `user2`, ... `userN`。
2. 垂直分表:按照列的不同将数据分散到多个表中。
例如,一个用户表可以分解为用户信息表和用户详细信息表。
3. 中间分表:结合水平分表和垂直分表的策略。
4. 按功能分表:根据功能模块的不同将数据分散到不同的表中。
5. 哈希分表:使用哈希函数将主键或某个字段的值映射到不同的表中。
6. 目录分表:使用一个中间表来记录其他表的映射关系。
例如,有一个目录表`dir`,其中每一行表示一个子表的名称和其对应的范围。
7. 分布式数据库:使用多个数据库服务器来分散数据。
这种方法的实现更为复杂,涉及到数据的跨服务器复制、查询路由等问题。
8. 使用分区:MySQL支持表的分区功能,可以基于列的值将数据分散到不同的物理区域中。
这种分区和真正的分表在某些情况下可以提供类似的效果。
9. 读写分离:通过主从复制,将读请求路由到一个或多个从库上,而写请求路由到主库上。
这种方法不是真正的分表,但可以提高系统的整体吞吐量。
10. 使用数据库中间件:使用如`MyCAT`、`ShardingSphere`等中间件可以帮助实现自动化的分表和路由,提供更为高级的功能,如数据迁移、数据合并等。
选择哪种分表方法取决于具体的业务需求、数据量、查询模式以及可接受的复杂度。
通常,分表策略的选择是一个迭代和优化的过程。
mysql分表场景分析与简单分表操作
为什么要分表
首先要知道什么情况下,才需要分表个人觉得单表记录条数达到百万到千万级别时就要使用分表了,分表的目的就在于此,减小数据库的负担,缩短查询时间.
表分割有两种方式:
1水平分割:根据一列或多列数据的值把数据行放到两个独立的表中。
水平分割通常在下面的情况下使用:
表很大,分割后可以降低在查询时需要读的数据和索引的页数,同时也降低了索引的层数,提高查询速度。
表中的数据本来就有独立性,例如表中分别记录各个地区的数据或不同时期的数据,特别是有些数据常用,而另外一些数据不常用。
需要把数据存放到多个介质上。
水平分割会给应用增加复杂度,它通常在查询时需要多个表名,查询所有数据需要union 操作。
在许多数据库应用中,这种复杂性会超过它带来的优点,因为只要索引关键字不大,则在索引用于查询时,表中增加两到三倍数据量,查询时也就增加读一个索引层的磁盘次数。
2垂直分割:把主码和一些列放到一个表,然后把主码和另外的列放到另一个表中。
如果一个表中某些列常用,而另外一些列不常用,则可以采用垂直分割,另外垂直分割可以使得数据行变小,一个数据页就能存放更多的数据,在查询时就会减少I/O次数。
其缺点是需要管理冗余列,查询所有数据需要join操作。
场景案例:
博客系统
垂直分割:
文章标题,作者,分类,创建时间等,是变化频率慢,查询次数多,而且最好有很好的实时性的数据,我们把它叫做冷数据。
而博客的浏览量,回复数等,类似的统计信息,或者别的变化频率比较高的数据,我们把它叫做活跃数据。
所以,在进行数据库结构设计的时候,就应该考虑分表,首先是纵向分表的处理。
这样纵向分表后:
首先存储引擎的使用不同,冷数据使用MyIsam可以有更好的查询数据。
活跃数据,可以使用Innodb,可以有更好的更新速度。
其次,对冷数据进行更多的从库配置,因为更多的操作是查询,这样来加快查询速度。
对热数据,可以相对有更多的主库的横向分表处理。
其实,对于一些特殊的活跃数据,也可以考虑使用memcache,redis之类的缓存,等累计到一定量再去更新数据库.
水平分割:
当博客的量达到很大时候,就应该采取横向分割来降低每个单表的压力,来提升性能。
例如博客的冷数据表,假如分为100个表,当同时有100万个用户在浏览时,如果是单表的话,会进行100万次请求,而现在分表后,就可能是每个表进行1万个数据的请求(因为,不可能绝对的平均,只是假设),这样压力就降低了很多很多。
使用Merge存储引擎展示水平分表实例:
查看mysql的存储引擎
mysql>show engines\G;
现实场景模拟
第一步:创建表member
DROP table IF EXISTS member;
create table member(
id bigint auto_increment primary key,
name varchar(20),
sex tinyint not null default'0'
)ENGINE=InnoDB DEFAULT CHARSET=utf8AUTO_INCREMENT=1;
第二步:创建存储过程,插入百万数据
#如果存在已定义的存储过程inserts,删除掉
drop procedure IF EXISTS inserts;
#自定义结束符
delimiter//
#创建存储过程
create procedure inserts()
begin
DECLARE i int;
set i=1;
WHILE(i<=10)DO
insert into member(name,sex)values(concat('name',i),i%2);
SET i=i+1;
END WHILE;
end;
#使用自定义结束符结束存储过程定义
//
#还原结束符为;
delimiter;
#调用存储过程
call inserts();
MySQL的语法默认使用分号";"作为一条SQL语句结束的标志.可以使用delimiter命令将其修改成其他符号,如:"delimiter//"表示以//作为提交符号.
为了演示分表,所以实例中插入10条数据模拟.
第三步:创建分表
#分表1#
DROP table IF EXISTS tb_member1;
create table tb_member1(
id bigint primary key auto_increment,
name varchar(20),
sex tinyint not null default'0'
)ENGINE=MyISAM DEFAULT CHARSET=utf8AUTO_INCREMENT=1;
#分表2#
DROP table IF EXISTS tb_member2;
#复制表1
create table tb_member2like tb_member1;
第四步:创建主表,这里主表的定义与要分的目标表有不同
#主表#
DROP table IF EXISTS tb_member;
create table tb_member(
id bigint auto_increment,
name varchar(20),
sex tinyint not null default'0',
INDEX(id)
)ENGINE=MERGE UNION=(tb_member1,tb_member2)INSERT_METHOD=LAST AUTO_INCREMENT=1;
查询tb_member表的索引信息
mysql>show index from tb_member\G;
第五步:将目标表数据分到两个分表中去
INSERT INTO tb_member1(tb_member1.id,tb_,tb_member1.sex) SELECT member.id,,member.sex
FROM member where member.id%2=0;
INSERT INTO tb_member2(tb_member2.id,tb_,tb_member2.sex) SELECT member.id,,member.sex
FROM member where member.id%2=1;
当然实际场景根据需要进行唯一标识操作,取hash啊什么的等等,这里只使用简单去求模分表.
第六步:查看分表数据
第七步:查看总表数据
这样就把表member中的数据分开了,分成的表组为tb_member为主表,tb_member1与tb_member2为分表.分表后,数据都是存放在分表里,总表只是一个外壳,存取数据发生在一个一个的分表里面。
对于merge表,需要注意的是
1.每个子表的结构必须一致,主表和子表的结构需要一致,
2.每个子表的索引在merge表中都会存在,所以在merge表中不能根据该索引进行唯一性检索。
3.子表需要是MyISAM引擎
4.REPLACE在merge表中不会工作
5.AUTO_INCREMENT不会按照你所期望的方式工作
创建Mysql Merge表的参数INSERT_METHOD有几个参数。
LAST如果你执行insert指令来操作merge表时,插入操作会把数据添加到最后一个子表中。
FIRST同理,执行插入数据时会把数据添加到第一个子表中。