MYSQL之分库分表

MySQL分表分区是解决大数据量导致MySQL性能低下的两种方法。

什么是MySQL分表

从表面意思上看,MySQL分表就是将一个表分成多个表,数据和数据结构都有可能会变。MySQL分表分为垂直分表和水平分表。

1.预先估计会出现大数据量并且访问频繁的表,将其分为若干个表
内容待更
2. 利用merge存储引擎来实现分表

   注意注意::
   总表(MERGE表)必须使用MRG_MyISAM存储引擎,子表必须使用MyISAM存储引擎,
   不可避免会受到MyISAM存储引擎的限制。

此方法比较适合,事先没考虑分表,数据量已经达到成百万上千万。
此时用merge存储引擎来实现分表,可在不改变业务代码的情况下,实现水平分表。

栗子:
此时有张表 js_order_innodb 数据量达到百万数据。决定将其分为20张子表。
在这里插入图片描述

一:创建5张子表
CREATE TABLE `js_order_innodb_1` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `get_telephone` varchar(30) NOT NULL COMMENT '收货人电话',
  `add_time` int(18) NOT NULL COMMENT '订单添加时间',
  PRIMARY KEY (`id`),
  KEY `add_time_index` (`add_time`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4;
//复制创建剩下的4个表
CREATE TABLE `js_order_innodb_2` LIKE `js_order_innodb_1`;
....
....
CREATE TABLE `js_order_innodb_4` LIKE `js_order_innodb_1`;

二:创建一张总表
CREATE TABLE `js_order_innodb_all` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `get_telephone` varchar(30) NOT NULL COMMENT '收货人电话',
  `add_time` int(18) NOT NULL COMMENT '订单添加时间',
  PRIMARY KEY (`id`),
  KEY `add_time_index` (`add_time`)
) ENGINE=MERGE UNION=(js_order_innodb_1.....js_order_innodb_20) INSERT_METHOD=LAST AUTO_INCREMENT=1 ;  
// 注意 INSERT_METHOD   
INSERT_METHOD=NO :不进行任何写操作,只作为查询使用。 
INSERT_METHOD=LAST :插入数据时,插入到最后一张表里面。
INSERT_METHOD=FIRST : 插入数据时,插入到第一张表里

三:数据进行拆分进子表中
//第一个表
INSERT INTO js_order_innodb_1 ( id, get_telephone, add_time ) SELECT
js_order_innodb.id, js_order_innodb.get_telephone, js_order_innodb.add_time
FROM
	js_order_innodb 
WHERE
	js_order_innodb.id <= 2000000;
	
//第二个表
INSERT INTO js_order_innodb_2 ( id, get_telephone, add_time ) SELECT
js_order_innodb.id, js_order_innodb.get_telephone, js_order_innodb.add_time
FROM
	js_order_innodb 
WHERE
	js_order_innodb.id > 2000000 
	AND js_order_innodb.id <= 4000000

四:测试总表 js_order_innodb_all 查询效率
 	下图可以看出,js_order_innodb_all表其实是个空表,存储了表结构,还有一个新文件 MRG,里面存放的是UNION 的关联子表。
 	要增加关联子表,可以修改该文件,并 	FLUSH TABLES;清除表缓存,或者直接alert 修改。

在这里插入图片描述

分表之后,查询数据速度大大增加。
缺点:
1.基于MERGE存储引擎实现的分表机制,比较适用于插入和查询频率较高的场景。
	由于MyISAM具有表级别的锁机制,所以不适用于更新频率较高的场景。
2.子表之间不能保证唯一键约束,只能保证单个子表内部的唯一性约束。
	(当查询唯一字段时,如果在其中一张表查到该数据,就不会再查询其它表)
3.总表和子表的表结构必须完全一致。
4.子表不支持分区(Partition)。

什么是MySQL分区

表分区,是指根据一定规则,将数据库中的一张表分解成多个更小的,容易管理的部分。从逻辑上看,只有一张表,但是底层却是由多个物理分区组成。

MySQL分区 操作流程

  1. 查看是否支持分区
show variables like '%partition%'
//have_partintioning 的值为YES,表示支持分区。 MySql5.1及以上版本支持分区功能

show PLUGINS;
//mysql 5.6 及5.6之后 可通过show PLUGINS 命令查看 partition  为 ACTIVE 时,表示支持分区
  1. mysql 分区支持的类型
1)RANGE分区:(注:连续分区)
range分区意思就是以某个字段为基准的连续分区,比如id小于3的1个分区,id小于6的一个分区,id小于100的一个分区。
2)LIST分区:
	(按照List中的值分区,与RANGE的区别是,range分区的区间范围值是连续的。) 
list分区就是以某个字段为基准,该字段从属于一个列表范围内的分区,比如id为1,3,5,7的一个分区,2,4,6,8的一个分区。
3)HASH分区 
hash分区用于确保数据在预先设定数目的分区中平均分布,比如预先设置分区数量为3个,则所有数据都会被平均分布在3个分区内。
4)KEY分区 
说明 在MySQL5.1版本中,RANGE,LIST,HASH分区要求分区键必须是INT类型,或者通过表达式返回INT类型。
但KEY分区的时候,可以使用其他类型的列(BLOB,TEXT类型除外)作为分区键
按照KEY进行分区类似于按照HASH分区,除了HASH分区使用的用户定义的表达式,而KEY分区的 哈希函数是由MySQL 服务器提供。

3.创建分区

1) 当数据库为innodb的时候,要想分区成功,必须把共享表空间设置为独立表空间
2) 编辑my.cnf 增加innodb_file_per_table=1,重启mysql,加载配置。

//创建 rang分区表
//注:分区时当有主键,分区字段必须包含主键,这边处理使用get_telephone 与 id 形成联合主键。
CREATE TABLE `js_order_innodb_partition` (
	`id` INT ( 11 ) UNSIGNED NOT NULL AUTO_INCREMENT,
	`get_telephone` INT	( 11 ) UNSIGNED NOT NULL COMMENT '收货人电话',
	PRIMARY KEY ( `id`,`get_telephone` )
) 
PARTITION BY RANGE (get_telephone) (
    PARTITION p0 VALUES LESS THAN (300000),
    PARTITION p1 VALUES LESS THAN (600000),
    PARTITION p2 VALUES LESS THAN (900000),
    PARTITION p3 VALUES LESS THAN (1200000),
	PARTITION p4 VALUES LESS THAN (1500000),
	PARTITION p5 VALUES LESS THAN MAXVALUE
);
//插入600W条数据后进行查询测试
分区后使用分区字段作为查询条件,速度明显增加。会直接到某一分区进行查找。
  1. 分区成功后,会生成对应的分区存储文件。
    在这里插入图片描述

什么是MySQL分区限制

1)一个表最多只能有1024个分区 
2) MySQL5.1中,分区表达式必须是整数,或者返回整数的表达式。在MySQL5.5中提供了非整数表达式分区的支持。 
3)如果分区字段中有主键或者唯一索引的列,那么多有主键列和唯一索引列都必须包含进来。即:分区字段要么不包含主键或者索引列,要么包含全部主键和索引列。
 4)分区表中无法使用外键约束 
 5)MySQL的分区适用于一个表的所有数据和索引,不能只对表数据分区而不对索引分区,也不能只对索引分区而不对表分区,也不能只对表的一部分数据分区。

什么是MySQL分区和分表的区别

1.	分区和分表的测重点不同,分表重点是存取数据时,如何提高mysql并发能力上;
		而分区呢,如何突破磁盘的读写能力,从而达到提高mysql性能的目的。
2.	

猜你喜欢

转载自blog.csdn.net/qq_39027055/article/details/88874896