问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

mysql分区会有缺点吗

发布网友 发布时间:2022-04-30 22:33

我来回答

4个回答

懂视网 时间:2022-05-01 02:54

但是如果e2里面的数据不能够满足分区p0的要求的话,切分区就会失败. 1737 - Found a row that does not match the partition 只有再指定不验证的时候才不会报错
ALTER TABLE e EXCHANGE PARTITION p0 WITH TABLE e2 WITHOUT VALIDATION;

WITHOUT VALIDATION 指定的时候效率会更高,因为不再做逐行验证了.

   

子分区和没分区的表进行切换

  1:假设创建一个分区表,带有子分区
> CREATE TABLE es (
 -> id INT NOT NULL,
 -> fname VARCHAR(30),
 -> lname VARCHAR(30)
 -> )
 -> PARTITION BY RANGE (id)
 -> SUBPARTITION BY KEY (lname)
 -> SUBPARTITIONS 2 (
 ->  PARTITION p0 VALUES LESS THAN (50),
 ->  PARTITION p1 VALUES LESS THAN (100),
 ->  PARTITION p2 VALUES LESS THAN (150),
 ->  PARTITION p3 VALUES LESS THAN (MAXVALUE)
 -> );
然后就可以切分区了,先查看一下分区, SELECT PARTITION_NAME, SUBPARTITION_NAME, TABLE_ROWS      FROM INFORMATION_SCHEMA.PARTITIONS      WHERE TABLE_NAME = ‘es‘; 然后切出分区:
ALTER TABLE es EXCHANGE PARTITION p3sp0 WITH TABLE es2;
当前执行切出分区前,必须要对新表做以下的处理:
ALTER TABLE es2 REMOVE PARTITIONING;
  修改表的默认引擎:
ALTER TABLE es3 ENGINE = MyISAM;
维护表分区 1:重建分区
ALTER TABLE t1 REBUILD PARTITION p0, p1;
2:重新组织分区
ALTER TABLE t1 OPTIMIZE PARTITION p0, p1;
3:分析某个分区,主要看行数和名称以及状态
ALTER TABLE t1 ANALYZE PARTITION p3;
4:修复分区,有重复值的时候就会报错.
ALTER TABLE t1 REPAIR PARTITION p0,p1;
5:检查分区的状态
ALTER TABLE trb3 CHECK PARTITION p1;
6:truncate分区   ALTER TABLE ... TRUNCATE PARTITION.
ALTER TABLE ... TRUNCATE PARTITION ALL    7:获取表的信息

Using the SHOW CREATE TABLE statement to view the partitioning clauses used in creating a partitioned table.

Using the SHOW TABLE STATUS statement to determine whether a table is partitioned.

Querying the INFORMATION_SCHEMA.PARTITIONS table.

Using the statement EXPLAIN PARTITIONS SELECT to see which partitions are used by a given SELECT.

看以下信息:
mysql> EXPLAIN PARTITIONS SELECT * FROM trb1G
*************************** 1. row ***************************
  id: 1
 select_type: SIMPLE
 table: trb1
 partitions: p0,p1,p2,p3
  type: ALL
possible_keys: NULL
  key: NULL
 key_len: NULL
  ref: NULL
  rows: 10
 Extra: Using filesort
      分区的经典案例:
mysql> CREATE TABLE employees_sub (
 -> id INT NOT NULL AUTO_INCREMENT,
 -> fname VARCHAR(25) NOT NULL,
 -> lname VARCHAR(25) NOT NULL,
 -> store_id INT NOT NULL,
 -> department_id INT NOT NULL,
 -> PRIMARY KEY pk (id, lname)
 -> ) 
 -> PARTITION BY RANGE(id)
 -> SUBPARTITION BY KEY (lname)
 -> SUBPARTITIONS 2 (
 ->  PARTITION p0 VALUES LESS THAN (5),
 ->  PARTITION p1 VALUES LESS THAN (10),
 ->  PARTITION p2 VALUES LESS THAN (15),
 ->  PARTITION p3 VALUES LESS THAN MAXVALUE
 -> );
分区的一些添删查修语句:
mysql> DELETE FROM employees PARTITION (p0, p1) 
 -> WHERE fname LIKE ‘j%‘;
Query OK, 2 rows affected (0.09 sec)
mysql> UPDATE employees PARTITION (p2)
 -> SET store_id = 2 WHERE fname = ‘Jill‘;
SELECT * FROM employees PARTITION (p2);
mysql> INSERT INTO employees PARTITION (p2) VALUES (20, ‘Jan‘, ‘Jones‘, 1, 3);ERROR 1729 (HY000): Found a row not matching the given partition set
mysql> INSERT INTO employees PARTITION (p3) VALUES (20, ‘Jan‘, ‘Jones‘, 1, 3);
Query OK, 1 row affected (0.07 sec)
分区不够多,要添加分区:
ysql> ALTER TABLE employees
 -> REORGANIZE PARTITION p3 INTO (
 ->  PARTITION p3 VALUES LESS THAN (20),
 ->  PARTITION p4 VALUES LESS THAN (25),
 ->  PARTITION p5 VALUES LESS THAN MAXVALUE
 -> );
Query OK, 6 rows affected (2.09 sec)
Records: 6 Duplicates: 0 Warnings: 0
      RANGE,LIST分区管理 1:为未分区表创建分区
ALTER TABLE trb3 PARTITION BY KEY(id) PARTITIONS 2;
2:删除某个分区的数据
ALTER TABLE tr DROP PARTITION p2;
3:为分区表添加一个分区
ALTER TABLE members ADD PARTITION (PARTITION p3 VALUES LESS THAN (2000));
ALTER TABLE tt ADD PARTITION (PARTITION p2 VALUES IN (7, 14, 21));
ALTER TABLE employees ADD PARTITION (
 PARTITION p5 VALUES LESS THAN (2010),
 PARTITION p6 VALUES LESS THAN MAXVALUE
);
4:将分区表的第一个分区分为两个新的分区
ALTER TABLE members
 REORGANIZE PARTITION p0 INTO (
 PARTITION n0 VALUES LESS THAN (1960),
 PARTITION n1 VALUES LESS THAN (1970)
);
5:也可以将两个分区合并为一个分区,也可以理解为重新组织分区
ALTER TABLE members REORGANIZE PARTITION s0,s1 INTO (
 PARTITION p0 VALUES LESS THAN (1970)
);
ALTER TABLE tbl_name
 REORGANIZE PARTITION partition_list
 INTO (partition_definitions);
ALTER TABLE members REORGANIZE PARTITION p0,p1,p2,p3 INTO (
 PARTITION m0 VALUES LESS THAN (1980),
 PARTITION m1 VALUES LESS THAN (2000)
);
ALTER TABLE tt ADD PARTITION (PARTITION np VALUES IN (4, 8));
ALTER TABLE tt REORGANIZE PARTITION p1,np INTO (
 PARTITION p1 VALUES IN (6, 18),
 PARTITION np VALUES in (4, 8, 12)
);
HASH,KEY 分区管理 1:创建一个hash分区表
CREATE TABLE clients (
 id INT,
 fname VARCHAR(30),
 lname VARCHAR(30),
 signed DATE
)
PARTITION BY HASH( MONTH(signed) )
PARTITIONS 12;
将分区表从12个分区变为8个分区
ALTER TABLE clients COALESCE PARTITION 4;
同样的有以下的语句关于KEY分区的表:
mysql> CREATE TABLE clients_lk (
 -> id INT,
 -> fname VARCHAR(30),
 -> lname VARCHAR(30),
 -> signed DATE
 -> )
 -> PARTITION BY LINEAR KEY(signed)
 -> PARTITIONS 12;
Query OK, 0 rows affected (0.03 sec)

mysql> ALTER TABLE clients_lk COALESCE PARTITION 4;
Query OK, 0 rows affected (0.06 sec)
Records: 0 Duplicates: 0 Warnings: 0
当然还有有限制的
mysql> ALTER TABLE clients COALESCE PARTITION 18;
ERROR 1478 (HY000): Cannot remove all partitions, use DROP TABLE instead
要是分区数比现有的分区数多的话,只能使用 ADD来添加分区数.下面就表示增加了6个分区数
ALTER TABLE clients ADD PARTITION PARTITIONS 6;
交换分区,子分区的管理 交换分区,ALTER TABLE pt EXCHANGE PARTITION p WITH TABLE nt where pt is the partitioned table and p is the partition or subpartition of pt to be exchanged with unpartitioned table nt, provided that the following statements are true: 要满足以下的条件: 1:PT是已经分区表,nt不是临时表 2:两张表的表结构必须是一模一样的 3:nt不能有外键约束,也不能有关于其他表的外键约束. 4:nt表中的数据没有分区P以外的数据.WITHOUT VALIDATION指定的时候这条就可以忽视调 另外很重要的一点就是想要拥有EXCHANGE的权限的话必须对全表有DROP的权限才可以执行.   alter table  ......EXCHANGE partition  将不会调用任何的触发器,执行完以后被EXCHANGE 的表的自增列就会重新赋初始值. 例如:
ALTER TABLE pt 
 EXCHANGE PARTITION p 
 WITH TABLE nt with VALIDATION ;
  1:将分区和一个没有分区的表EXCHANGE   创建表插入语句:
CREATE TABLE e (
 id INT NOT NULL,
 fname VARCHAR(30),
 lname VARCHAR(30)
)
 PARTITION BY RANGE (id) (
 PARTITION p0 VALUES LESS THAN (50),
 PARTITION p1 VALUES LESS THAN (100),
 PARTITION p2 VALUES LESS THAN (150),
 PARTITION p3 VALUES LESS THAN (MAXVALUE)
);

INSERT INTO e VALUES 
 (1669, "Jim", "Smith"),
 (337, "Mary", "Jones"),
 (16, "Frank", "White"),
 (2005, "Linda", "Black");
查看分区和分区的行数    SELECT PARTITION_NAME, TABLE_ROWS      FROM INFORMATION_SCHEMA.PARTITIONS      WHERE TABLE_NAME = ‘e‘;  
SELECT TABLE_NAME, PARTITION_NAME, TABLE_ROWS, AVG_ROW_LENGTH, DATA_LENGTH FROM INFORMATION_SCHEMA.PARTITIONS WHERE TABLE_SCHEMA = ‘p‘ AND TABLE_NAME LIKE ‘e‘;
创建新表:
CREATE TABLE e2 LIKE e;
然后交换分区开始了:
ALTER TABLE e EXCHANGE PARTITION p0 WITH TABLE e2;
这个语句是很奇怪的,如果e2里面没有数据的话就是切出分区,如果e2里面有数据的话就是相互交换 但是如果e2里面的数据不能够满足分区p0的要求的话,切分区就会失败. 1737 - Found a row that does not match the partition 只有再指定不验证的时候才不会报错
ALTER TABLE e EXCHANGE PARTITION p0 WITH TABLE e2 WITHOUT VALIDATION;
WITHOUT VALIDATION 指定的时候效率会更高,因为不再做逐行验证了.     子分区和没分区的表进行切换   1:假设创建一个分区表,带有子分区
> CREATE TABLE es (
 -> id INT NOT NULL,
 -> fname VARCHAR(30),
 -> lname VARCHAR(30)
 -> )
 -> PARTITION BY RANGE (id)
 -> SUBPARTITION BY KEY (lname)
 -> SUBPARTITIONS 2 (
 ->  PARTITION p0 VALUES LESS THAN (50),
 ->  PARTITION p1 VALUES LESS THAN (100),
 ->  PARTITION p2 VALUES LESS THAN (150),
 ->  PARTITION p3 VALUES LESS THAN (MAXVALUE)
 -> );
然后就可以切分区了,先查看一下分区, SELECT PARTITION_NAME, SUBPARTITION_NAME, TABLE_ROWS      FROM INFORMATION_SCHEMA.PARTITIONS      WHERE TABLE_NAME = ‘es‘; 然后切出分区:
ALTER TABLE es EXCHANGE PARTITION p3sp0 WITH TABLE es2;
当前执行切出分区前,必须要对新表做以下的处理:
ALTER TABLE es2 REMOVE PARTITIONING;
  修改表的默认引擎:
ALTER TABLE es3 ENGINE = MyISAM;
维护表分区 1:重建分区
ALTER TABLE t1 REBUILD PARTITION p0, p1;
2:重新组织分区
ALTER TABLE t1 OPTIMIZE PARTITION p0, p1;
3:分析某个分区,主要看行数和名称以及状态
ALTER TABLE t1 ANALYZE PARTITION p3;
4:修复分区,有重复值的时候就会报错.
ALTER TABLE t1 REPAIR PARTITION p0,p1;
5:检查分区的状态
ALTER TABLE trb3 CHECK PARTITION p1;
6:truncate分区   ALTER TABLE ... TRUNCATE PARTITION.
ALTER TABLE ... TRUNCATE PARTITION ALL    7:获取表的信息

Using the SHOW CREATE TABLE statement to view the partitioning clauses used in creating a partitioned table.

Using the SHOW TABLE STATUS statement to determine whether a table is partitioned.

Querying the INFORMATION_SCHEMA.PARTITIONS table.

Using the statement EXPLAIN PARTITIONS SELECT to see which partitions are used by a given SELECT.

看以下信息:
mysql> EXPLAIN PARTITIONS SELECT * FROM trb1G
*************************** 1. row ***************************
  id: 1
 select_type: SIMPLE
 table: trb1
 partitions: p0,p1,p2,p3
  type: ALL
possible_keys: NULL
  key: NULL
 key_len: NULL
  ref: NULL
  rows: 10
 Extra: Using filesort
      分区的经典案例:
mysql> CREATE TABLE employees_sub (
 -> id INT NOT NULL AUTO_INCREMENT,
 -> fname VARCHAR(25) NOT NULL,
 -> lname VARCHAR(25) NOT NULL,
 -> store_id INT NOT NULL,
 -> department_id INT NOT NULL,
 -> PRIMARY KEY pk (id, lname)
 -> ) 
 -> PARTITION BY RANGE(id)
 -> SUBPARTITION BY KEY (lname)
 -> SUBPARTITIONS 2 (
 ->  PARTITION p0 VALUES LESS THAN (5),
 ->  PARTITION p1 VALUES LESS THAN (10),
 ->  PARTITION p2 VALUES LESS THAN (15),
 ->  PARTITION p3 VALUES LESS THAN MAXVALUE
 -> );
分区的一些添删查修语句:
mysql> DELETE FROM employees PARTITION (p0, p1) 
 -> WHERE fname LIKE ‘j%‘;
Query OK, 2 rows affected (0.09 sec)
mysql> UPDATE employees PARTITION (p2)
 -> SET store_id = 2 WHERE fname = ‘Jill‘;
SELECT * FROM employees PARTITION (p2);
mysql> INSERT INTO employees PARTITION (p2) VALUES (20, ‘Jan‘, ‘Jones‘, 1, 3);ERROR 1729 (HY000): Found a row not matching the given partition set
mysql> INSERT INTO employees PARTITION (p3) VALUES (20, ‘Jan‘, ‘Jones‘, 1, 3);
Query OK, 1 row affected (0.07 sec)
分区不够多,要添加分区:
ysql> ALTER TABLE employees
 -> REORGANIZE PARTITION p3 INTO (
 ->  PARTITION p3 VALUES LESS THAN (20),
 ->  PARTITION p4 VALUES LESS THAN (25),
 ->  PARTITION p5 VALUES LESS THAN MAXVALUE
 -> );
Query OK, 6 rows affected (2.09 sec)
Records: 6 Duplicates: 0 Warnings: 0
         

                               

                           

MySQL分区管理

标签:

热心网友 时间:2022-05-01 00:02

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

热心网友 时间:2022-05-01 01:20

分区不容易实现scale,不能直接使用join的。

热心网友 时间:2022-05-01 02:55

一般生产环境不建议使用分区表
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
苹果电脑电池充不进电苹果电脑充不进去电是怎么回事 苹果电脑不充电没反应苹果电脑充电指示灯不亮充不了电怎么办 狗狗更加忠诚护家、善解人意,养一只宠物陪伴自己,泰迪能长多大... 描写泰迪狗的外形和特点的句子 国外留学有用吗 花钱出国留学有用吗 !这叫什么号 百万医疗赔付后是否可以续保 前一年理赔过医疗险还能续保吗? 医疗住院险理赔后还能购买吗? 小学五年级同步练习 多边形的面积第45页第5题 五年级上册数学家庭作业6多边形的面积第5课时梯形的面积第6题怎么做 五年级上册数学多边形面积题。。 五年级上册数学多边形的面积(一道数学题) 求4道小学五年级(多边形的面积)数学题答案 小学五年级数学多边形的面积题(列式计算) 为什么要选择你们做微信小程序呢? 如果电风扇逆转该怎么办? 微信小程序有必要做吗? 听一些开店的朋友最近在说,要做一个微信小程序,这是什么?有什么用处? 风扇倒转的原因是什么 电风扇反转如何处理 银行柜员就业前景 三八妇女节送什么礼物好啊? 我的电冰箱,总是漏水,而且保鲜区还结冰,求解, 手机充到多少电量最好 三八妇女节送女性什么礼物好? 女人更年期如何保养,吃什么能延迟更年期 冰箱结冰漏水漏出来了,该怎么办? 妇女节送女性什么礼物最好啊? 世界上有哪些有名的大峡谷? 中国大峡谷有哪些 世界最著名的十大峡谷有哪些? 有什么大峡谷? 美国最有名的大峡谷叫什么? 大峡谷的特点什么,山的特点是什么 深圳大峡谷指的是哪里? 什么是大峡谷 港币在什么银行可以兑换成人民币 卖瓶装饮料需要办什么证 游乐场只卖矿泉水需要办理食品经营许可证吗 老师,一般的商贸批发行业可以卖瓶装矿泉水吗?还是要有特殊的食品许可证才可以? 拼多多卖矿泉水需要什么证件? 事业编预防和保护膜管理那些的活动? 卖些瓶装饮料和槟榔需要办食品经营许可证吗? 华为gt2如何接消息 开一家送桶装纯净水的店需不需要办理食品流通经营许可证? 2022小店里买矿泉水之类的要什么手续吗 销售生活散装水需要什么手续 超市卖饮料需要食品流通许可证么