一文看懂 MySQL 分区和分表,提升表增删改查效率

下载网站:www.SyncNavigator.CN 
 客服QQ1793040
----------------------------------------------------------node


关于HKROnline SyncNavigator 注册机价格的问题mysql

 

 

HKROnline SyncNavigator 8.4.1 非破解版 注册机 受权激活教程
 sql

 

 

 

最近一直在研究数据库同步的问题,在网上查了不少资料,也请教了不少人,找到了一种经过快照复制的方法。研究了一番后发现以前就是用的这个方法,效果不是很好,果断放弃。通过了一番寻觅和他人指点,最后从一位热心网友那里得知一款很好用的软件—— SyncNavigator。数据库

 

 

好东西就要拿出来跟你们分享,因此今天向你们介绍一下这款软件,及其一些使用方法。下面先看看它有什么强大的功能吧!网络

 

SyncNavigator的基本功能:并发

 

自动同步数据/定时同步数据
不管是实时同步/24小时不间断同步,仍是根据计划任务(每小时/每日/每周/等)定时自动同步都能彻底胜任。app

完整支持 Microsoft SQL Server
完整支持 Microsoft SQL Server 2000 2005 2008 数据库类型。并能在不一样数据库版本之间相互同步数据。less

支持 MySQL 4.1 以上版本
支持 MySQL 4.1 5.0 5.1 5.4 5.5。并能在不一样数据库版本之间相互同步数据。函数

无人值守和故障自动恢复
当数据库故障或网络故障之后,无需人工干预(或操做)自动恢复同步并确保数据彻底准确,可靠。高并发

同构数据库同步/异构数据库同步
SQL Server to SQL Server, MySQL to MySQL, SQL Server to MySQL 等都能轻松实现。

断点续传和增量同步
当同步完成(或中断)后,再次同步时能继续上一次的位置增量同步,避免每次都须要从头开始的问题。

平常开发中咱们常常会遇到大表的状况,所谓的大表是指存储了百万级乃至千万级条记录的表。这样的表过于庞大,致使数据库在查询和插入的时候耗时太长,性能低下,若是涉及联合查询的状况,性能会更加糟糕。分表和表分区的目的就是减小数据库的负担,提升数据库的效率,一般点来说就是提升表的增删改查效率。

什么是分表?

分表是将一个大表按照必定的规则分解成多张具备独立存储空间的实体表,咱们能够称为子表,每一个表都对应三个文件,MYD数据文件,.MYI索引文件,.frm表结构文件。这些子表能够分布在同一块磁盘上,也能够在不一样的机器上。app读写的时候根据事先定义好的规则获得对应的子表名,而后去操做它。

什么是分区?

分区和分表类似,都是按照规则分解表。不一样在于分表将大表分解为若干个独立的实体表,而分区是将数据分段划分在多个位置存放,能够是同一块磁盘也能够在不一样的机器。分区后,表面上仍是一张表,但数据散列到多个位置了。app读写的时候操做的仍是大表名字,db自动去组织分区的数据。

mysql分表和分区有什么联系呢?

1.都能提升mysql的性高,在高并发状态下都有一个良好的表现。

2.分表和分区不矛盾,能够相互配合的,对于那些大访问量,而且表数据比较多的表,咱们能够采起分表和分区结合的方式(若是merge这种分表方式,不能和分区配合的话,能够用其余的分表试),访问量不大,可是表数据不少的表,咱们能够采起分区的方式等。

3.分表技术是比较麻烦的,须要手动去建立子表,app服务端读写时候须要计算子表名。采用merge好一些,但也要建立子表和配置子表间的union关系。

4.表分区相对于分表,操做方便,不须要建立子表。

分区又能够分为两种:

水平分区(Horizontal Partitioning)

这种形式分区是对表的行进行分区,经过这样的方式不一样分组里面的物理列分割的数据集得以组合,从而进行个体分割(单分区)或集体分割(1个或多个分区)。全部在表中定义的列在每一个数据集中都能找到,

因此表的特性依然得以保持。

举个简单例子:一个包含十年发票记录的表能够被分区为十个不一样的分区,每一个分区包含的是其中一年的记录。(注:这里具体使用的分区方式咱们后面再说,能够先说一点,必定要经过某个属性列来分割,譬如这里使用的列就是年份)

垂直分区(Vertical Partitioning)

这种分区方式通常来讲是经过对表的垂直划分来减小目标表的宽度,使某些特定的列被划分到特定的分区,每一个分区都包含了其中的列所对应的行。

举个简单例子:一个包含了大text和BLOB列的表,这些text和BLOB列又不常常被访问,这时候就要把这些不常用的text和BLOB了划分到另外一个分区,在保证它们数据相关性的同时还能提升访问速度。

分区表的原理

分区表是由多个相关的底层表实现,这些底层表也是由句柄对象表示,因此咱们也能够直接访问各个分区,存储引擎管理分区的各个底层表和管理普通表同样(全部的底层表都必须使用相同的存储引擎),分区表的索引只是在各个底层表上各自加上一个相同的索引,从存储引擎的角度来看,底层表和一个普通表没有任何不一样,存储引擎也无须知道这是一个普通表仍是一个分区表的一部分。

在分区表上的操做按照下面的操做逻辑进行:

select查询:

当查询一个分区表的时候,分区层先打开并锁住全部的底层表,优化器判断是否能够过滤部分分区,而后再调用对应的存储引擎接口访问各个分区的数据

insert操做:

当写入一条记录时,分区层打开并锁住全部的底层表,而后肯定哪一个分区接受这条记录,再将记录写入对应的底层表

delete操做:

当删除一条记录时,分区层先打开并锁住全部的底层表,而后肯定数据对应的分区,最后对相应底层表进行删除操做

update操做:

当更新一条数据时,分区层先打开并锁住全部的底层表,mysql先肯定须要更新的记录在哪一个分区,而后取出数据并更新,再判断更新后的数据应该放在哪一个分区,而后对底层表进行写入操做,并对原数据所在的底层表进行删除操做

虽然每一个操做都会打开并锁住全部的底层表,但这并非说分区表在处理过程当中是锁住全表的,若是存储引擎可以本身实现行级锁,如:innodb,则会在分区层释放对应的表锁,这个加锁和解锁过程与普通Innodb上的查询相似。

在下面的场景中,分区能够起到很是大的做用:

A:表很是大以致于没法所有都放在内存中,或者只在表的最后部分有热点数据,其余都是历史数据

B:分区表的数据更容易维护,如:想批量删除大量数据可使用清除整个分区的方式。另外,还能够对一个独立分区进行优化、检查、修复等操做

C:分区表的数据能够分布在不一样的物理设备上,从而高效地利用多个硬件设备

D:可使用分区表来避免某些特殊的瓶颈,如:innodb的单个索引的互斥访问,ext3文件系统的inode锁竞争等

E:若是须要,还能够备份和恢复独立的分区,这在很是大的数据集的场景下效果很是好

F:优化查询,在where字句中包含分区列时,能够只使用必要的分区来提升查询效率,同时在涉及sum()和count()这类聚合函数的查询时,能够在每一个分区上面并行处理,最终只须要汇总全部分区获得的结果。

mysql数据库的分区老是把null看成比任何非null更小的值,这和数据库中处理null值的order by操做是同样的,升序排序时null老是在最前面,所以对于不一样的分区类型,mysql数据库对于null的处理也各不相同。对于range分区,若是向分区列插入了null,则mysql数据库会将该值放入最左边的分区,注意,若是删除分区,分区下的全部内容都从磁盘中删掉了,null所在分区被删除,null值也就跟着被删除了。在list分区下要使用null,则必须显式地定义在分区的散列值中,不然插入null时会报错。hash和key分区对于null的处理方式和range,list分区不同,任何分区函数都会将null返回为0.

分区

分区就是将数据库或其构成元素划分为不一样的独立部分

--是一种预先组织表存储的方法

mysql支持水平分区

将特定表行分配为行的子集

分区的分布是跨物理存储进行的

--根据用户在须要时设置的指定规则

--每一个分区存储为其本身的单元

数据的划分

--根据分区功能将数据划分为子集

--分区类型和表达式是表定义的一部分

--表达式能够是整数或返回整数值的函数。

--此值根据定义肯定将每条记录存储在哪一个分区中

1.primary key和unique key必须包含在分区key的一部分,不然在建立primary key和unique index时会报”ERROR 1503 (HY000)“

2.范围分区添加分区只能在最大值后面追加分区

3.全部分区的engine必须同样

4.范围分区分区字段:integer、数值表达式、日期列,日期函数表达式(如year(),to_days(),to_seconds(),unix_timestamp())

分表的几种方式:

一、mysql集群

它并非分表,但起到了和分表相同的做用。集群可分担数据库的操做次数,将任务分担到多台数据库上。集群能够读写分离,减小读写压力。从而提高数据库性能。

二、自定义规则分表

分区的类型

range 根据属于指定范围的列值将行分配到分区

list 根据与离散值集之一匹配的列将行分配到分区

hash 基于由用户定义的表达式返回的值而选择的分区,对要插入表中的行的列值进行操做

key 与hash相似,不一样之处在于仅提供要评估的一个或多个列

Composite(复合模式) –以上模式的组合使用

InnoDB foreign keys and MySQL partitioning are not compatible. Partitioned InnoDB tables cannot have foreign key references, nor can they have columns referenced by foreign keys. InnoDB tables which have or which are referenced by foreign keys cannot be partitioned.

分区的几种方式实践:

Range:
create table range(
id int(11),
money int(11) unsigned not null,
date datetime
)partition by range(year(date))(
partition p2007 values less than (2008),
partition p2008 values less than (2009),
partition p2009 values less than (2010)
partition p2010 values less than maxvalue
);
List:

create table list(
a int(11),
b int(11)
)(partition by list (b)
partition p0 values in (1,3,5,7,9),
partition p1 values in (2,4,6,8,0)
);
Hash:

create table hash(
a int(11),
b datetime
)partition by hash (YEAR(b)
partitions 4;
Key:

create table t_key(
a int(11),
b datetime)
partition by key (b)
partitions 4;

分区管理

新增分区

ALTER TABLE sale_data
ADD PARTITION (PARTITION p201010 VALUES LESS THAN (201011));

删除分区

–当删除了一个分区,也同时删除了该分区中全部的数据。
ALTER TABLE sale_data DROP PARTITION p201010;

分区的合并

下面的SQL,将p201001 – p201009 合并为3个分区p2010Q1 – p2010Q3

ALTER TABLE sale_dataREORGANIZE PARTITION p201001,p201002,p201003,p201004,p201005,p201006,p201007,p201008,p201009 INTO(PARTITION p2010Q1 VALUES LESS THAN (201004),PARTITION p2010Q2 VALUES LESS THAN (201007),PARTITION p2010Q3 VALUES LESS THAN (201010));

相关文章
相关标签/搜索