欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Mysql分區(qū)表的管理與維護

 更新時間:2016年08月12日 11:05:36   投稿:mrr  
改變一個表的分區(qū)方案只需使用alter table 加 partition_options 子句就可以了。這篇文章主要介紹了Mysql分區(qū)表的管理與維護,非常不錯,感興趣的朋友一起學習吧,需要的朋友可以參考下

改變一個表的分區(qū)方案只需使用alter table 加 partition_options 子句就可以了。和創(chuàng)建分區(qū)表時的create table語句很像。

創(chuàng)建表

CREATE TABLE trb3 (id INT, name VARCHAR(50), purchased DATE)
PARTITION BY RANGE( YEAR(purchased) ) (
PARTITION p0 VALUES LESS THAN (1990),
PARTITION p1 VALUES LESS THAN (1995),
PARTITION p2 VALUES LESS THAN (2000),
PARTITION p3 VALUES LESS THAN (2005)
);

創(chuàng)建插入數(shù)據(jù)存儲過程

delimiter $$
drop procedure if exists pr_trb3$$
create procedure pr_trb3(in begindate date,in enddate date,in tabname varchar(40))
begin
while begindate<enddate 1="" begindate="date_add(begindate,interval" delimiter="" do="" drop="" end="" execute="" from="" insert="" pre="" prepare="" s="concat_ws('" set="" stmt=""><p>調用存儲過程插入數(shù)據(jù)</p><pre class="brush:sql;">call pr_trb3('1985-01-01','2004-12-31','trb3');</pre>
<p>查看數(shù)據(jù)分布</p>
<pre class="brush:sql;">select 
partition_name part, 
partition_expression expr, 
partition_description descr, 
table_rows 
from information_schema.partitions where 
table_schema = schema() 
and table_name='trb3';
+------+------------------+-------+------------+
| part | expr | descr | table_rows |
+------+------------------+-------+------------+
| p0 | YEAR(purchased) | 1990 | 1826 |
| p1 | YEAR(purchased) | 1995 | 1826 |
| p2 | YEAR(purchased) | 2000 | 1826 |
| p3 | YEAR(purchased) | 2005 | 1826 |
+------+------------------+-------+------------+
4 rows in set (0.00 sec)</pre>
<p>改變分區(qū)方案</p>
<pre class="brush:sql;">mysql> ALTER TABLE trb3 PARTITION BY KEY(id) PARTITIONS 4;
Query OK, 7304 rows affected (0.07 sec)
Records: 7304 Duplicates: 0 Warnings: 0</pre>
<p>查看數(shù)據(jù)</p>
<pre class="brush:sql;">select 
partition_name part, 
partition_expression expr, 
partition_description descr, 
table_rows 
from information_schema.partitions where 
table_schema = schema() 
and table_name='trb3';
+------+------+-------+------------+
| part | expr | descr | table_rows |
+------+------+-------+------------+
| p0 | `id` | NULL | 7472 |
| p1 | `id` | NULL | 0 |
| p2 | `id` | NULL | 0 |
| p3 | `id` | NULL | 0 |
+------+------+-------+------------+
4 rows in set (0.00 sec)
mysql> select 1826*4;
+--------+
| 1826*4 |
+--------+
| 7304 |
+--------+
1 row in set (0.00 sec)</pre>
<p>count(*)行數(shù)一致,說明數(shù)據(jù)沒出問題,但是information_schema.partitions查出來的不對<del>,這就不知道為什么了</del></p>
<blockquote>
<p>For partitioned InnoDB tables, the row count given in the TABLE_ROWS column of the INFORMATION_SCHEMA.PARTITIONS table is only an estimated value used in SQL optimization, and is not always exact.</p>
</blockquote>
<pre class="brush:sql;">mysql> select count(*) from trb3;
+----------+
| count(*) |
+----------+
| 7304 |
+----------+
但是count(*)還是7304,什么鬼</pre>
<p>再次改變分區(qū)方案</p>
<pre class="brush:sql;">ALTER TABLE trb3 
PARTITION BY RANGE( YEAR(purchased) ) (
PARTITION p0 VALUES LESS THAN (1990),
PARTITION p1 VALUES LESS THAN (1995),
PARTITION p2 VALUES LESS THAN (2000),
PARTITION p3 VALUES LESS THAN (2005)
);
mysql> select 
-> partition_name part, 
-> partition_expression expr, 
-> partition_description descr, 
-> table_rows 
-> from information_schema.partitions where 
-> table_schema = schema() 
-> and table_name='trb3';
+------+------------------+-------+------------+
| part | expr | descr | table_rows |
+------+------------------+-------+------------+
| p0 | YEAR(purchased) | 1990 | 1826 |
| p1 | YEAR(purchased) | 1995 | 1826 |
| p2 | YEAR(purchased) | 2000 | 0 |
| p3 | YEAR(purchased) | 2005 | 0 |
+------+------------------+-------+------------+
4 rows in set (0.00 sec)</pre>
<p><del>丟數(shù)據(jù)了。。</del><br>
更正,實際沒丟,這個information_shcema.partitions表有延遲,過一會再查就好了</p>
<pre class="brush:sql;">mysql> select 
-> partition_name part, 
-> partition_expression expr, 
-> partition_description descr, 
-> table_rows 
-> from information_schema.partitions where 
-> table_schema = schema() 
-> and table_name='trb3';
+------+------------------+-------+------------+
| part | expr | descr | table_rows |
+------+------------------+-------+------------+
| p0 | YEAR(purchased) | 1990 | 1826 |
| p1 | YEAR(purchased) | 1995 | 1826 |
| p2 | YEAR(purchased) | 2000 | 1826 |
| p3 | YEAR(purchased) | 2005 | 1826 |
+------+------------------+-------+------------+
4 rows in set (0.00 sec)</pre>
<p>官方文檔說:<br>
This has the same effect on the structure of the table as dropping the table and re-creating it using CREATE TABLE trb3 PARTITION BY KEY(id) PARTITIONS 2;<br>
就是說ALTER TABLE trb3 PARTITION BY與 drop table然后重新create table trb3 partition by key(id) partitions 2一樣呢。</p>
<h3 id="改存儲引擎和普通表沒啥區(qū)別">改存儲引擎,和普通表沒啥區(qū)別</h3>
<pre class="brush:sql;">mysql> drop table trb3;
Query OK, 0 rows affected (0.01 sec)
mysql> CREATE TABLE trb3 (id INT, name VARCHAR(50), purchased DATE)
-> PARTITION BY RANGE( YEAR(purchased) ) (
-> PARTITION p0 VALUES LESS THAN (1990),
-> PARTITION p1 VALUES LESS THAN (1995),
-> PARTITION p2 VALUES LESS THAN (2000),
-> PARTITION p3 VALUES LESS THAN (2005)
-> );
Query OK, 0 rows affected (0.03 sec)
mysql> call pr_trb3('1985-01-01','2004-12-31','trb3');
Query OK, 0 rows affected (1.69 sec)
mysql> select 
-> partition_name part, 
-> partition_expression expr, 
-> partition_description descr, 
-> table_rows 
-> from information_schema.partitions where 
-> table_schema = schema() 
-> and table_name='trb3';
+------+------------------+-------+------------+
| part | expr | descr | table_rows |
+------+------------------+-------+------------+
| p0 | YEAR(purchased) | 1990 | 1826 |
| p1 | YEAR(purchased) | 1995 | 1826 |
| p2 | YEAR(purchased) | 2000 | 1826 |
| p3 | YEAR(purchased) | 2005 | 1826 |
+------+------------------+-------+------------+
4 rows in set (0.01 sec)
mysql> alter table trb3 engine=myisam;
Query OK, 7304 rows affected (0.02 sec)
Records: 7304 Duplicates: 0 Warnings: 0
mysql> select 
-> partition_name part, 
-> partition_expression expr, 
-> partition_description descr, 
-> table_rows 
-> from information_schema.partitions where 
-> table_schema = schema() 
-> and table_name='trb3';
+------+------------------+-------+------------+
| part | expr | descr | table_rows |
+------+------------------+-------+------------+
| p0 | YEAR(purchased) | 1990 | 1826 |
| p1 | YEAR(purchased) | 1995 | 1826 |
| p2 | YEAR(purchased) | 2000 | 1826 |
| p3 | YEAR(purchased) | 2005 | 1826 |
+------+------------------+-------+------------+
4 rows in set (0.01 sec)
mysql> show create table trb3\G
*************************** 1. row ***************************
Table: trb3
Create Table: CREATE TABLE `trb3` (
`id` int(11) DEFAULT NULL,
`name` varchar(50) DEFAULT NULL,
`purchased` date DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8
/*!50100 PARTITION BY RANGE ( YEAR(purchased))
(PARTITION p0 VALUES LESS THAN (1990) ENGINE = MyISAM,
PARTITION p1 VALUES LESS THAN (1995) ENGINE = MyISAM,
PARTITION p2 VALUES LESS THAN (2000) ENGINE = MyISAM,
PARTITION p3 VALUES LESS THAN (2005) ENGINE = MyISAM) */
1 row in set (0.00 sec)</pre>
<h3 id="將表由分區(qū)表改為非分區(qū)表">將表由分區(qū)表改為非分區(qū)表</h3>
<pre class="brush:sql;">mysql> alter table trb3 remove partitioning;
Query OK, 7304 rows affected (0.01 sec)
Records: 7304 Duplicates: 0 Warnings: 0
mysql> select 
-> partition_name part, 
-> partition_expression expr, 
-> partition_description descr, 
-> table_rows 
-> from information_schema.partitions where 
-> table_schema = schema() 
-> and table_name='trb3';
+------+------+-------+------------+
| part | expr | descr | table_rows |
+------+------+-------+------------+
| NULL | NULL | NULL | 7304 |
+------+------+-------+------------+
1 row in set (0.00 sec)
mysql> show create table trb3\G
*************************** 1. row ***************************
Table: trb3
Create Table: CREATE TABLE `trb3` (
`id` int(11) DEFAULT NULL,
`name` varchar(50) DEFAULT NULL,
`purchased` date DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8
1 row in set (0.00 sec)</pre>
<h3 id="range-list分區(qū)管理">Range List分區(qū)管理</h3>
<pre class="brush:sql;">mysql> drop table trb3;
Query OK, 0 rows affected (0.01 sec)
mysql> CREATE TABLE trb3 (id INT, name VARCHAR(50), purchased DATE)
-> PARTITION BY RANGE( YEAR(purchased) ) (
-> PARTITION p0 VALUES LESS THAN (1990),
-> PARTITION p1 VALUES LESS THAN (1995),
-> PARTITION p2 VALUES LESS THAN (2000),
-> PARTITION p3 VALUES LESS THAN (2005)
-> );
Query OK, 0 rows affected (0.03 sec)
mysql> call pr_trb3('1985-01-01','2004-12-31','trb3');
Query OK, 0 rows affected (1.75 sec)
mysql> select 
-> partition_name part, 
-> partition_expression expr, 
-> partition_description descr, 
-> table_rows 
-> from information_schema.partitions where 
-> table_schema = schema() 
-> and table_name='trb3';
+------+------------------+-------+------------+
| part | expr | descr | table_rows |
+------+------------------+-------+------------+
| p0 | YEAR(purchased) | 1990 | 1826 |
| p1 | YEAR(purchased) | 1995 | 1826 |
| p2 | YEAR(purchased) | 2000 | 1826 |
| p3 | YEAR(purchased) | 2005 | 1826 |
+------+------------------+-------+------------+
4 rows in set (0.00 sec)</pre>
<h4 id="增加分區(qū)">增加分區(qū)</h4>
<pre class="brush:sql;">mysql> alter table trb3 add partition (partition p5 values less than(2010));
Query OK, 0 rows affected (0.00 sec)
Records: 0 Duplicates: 0 Warnings: 0</pre>
<h4 id="合并分區(qū)">合并分區(qū)</h4>
<pre class="brush:sql;">mysql> alter table trb3 reorganize partition p3,p5 into(partition p5 values less than(2010));
Query OK, 1826 rows affected (0.03 sec)
Records: 1826 Duplicates: 0 Warnings: 0
mysql> select 
-> partition_name part, 
-> partition_expression expr, 
-> partition_description descr, 
-> table_rows 
-> from information_schema.partitions where 
-> table_schema = schema() 
-> and table_name='trb3';
+------+------------------+-------+------------+
| part | expr | descr | table_rows |
+------+------------------+-------+------------+
| p0 | YEAR(purchased) | 1990 | 1826 |
| p1 | YEAR(purchased) | 1995 | 1826 |
| p2 | YEAR(purchased) | 2000 | 1826 |
| p5 | YEAR(purchased) | 2010 | 1826 |
+------+------------------+-------+------------+
4 rows in set (0.00 sec)</pre>
<h4 id="分裂分區(qū)">分裂分區(qū)</h4>
<pre class="brush:sql;">mysql> ALTER TABLE trb3 REORGANIZE PARTITION p5 INTO (
-> PARTITION p3 VALUES LESS THAN (2005),
-> PARTITION p4 VALUES LESS THAN (2010)
-> );
Query OK, 1826 rows affected (0.04 sec)
Records: 1826 Duplicates: 0 Warnings: 0
select 
partition_name part, 
partition_expression expr, 
partition_description descr, 
table_rows 
from information_schema.partitions where 
table_schema = schema() 
and table_name='trb3';
+------+------------------+-------+------------+
| part | expr | descr | table_rows |
+------+------------------+-------+------------+
| p0 | YEAR(purchased) | 1990 | 1826 |
| p1 | YEAR(purchased) | 1995 | 1826 |
| p2 | YEAR(purchased) | 2000 | 1826 |
| p3 | YEAR(purchased) | 2005 | 1826 |
| p4 | YEAR(purchased) | 2010 | 0 |
+------+------------------+-------+------------+
5 rows in set (0.00 sec)</pre>
<h3 id="hash-key分區(qū)">HASH KEY分區(qū)</h3>
<pre class="brush:sql;">CREATE TABLE trb3 (id INT, name VARCHAR(50), purchased DATE)
PARTITION BY hash( YEAR(purchased) ) 
partitions 12;
mysql>call pr_trb3('1985-01-01','2004-12-31','trb3');
select 
partition_name part, 
partition_expression expr, 
partition_description descr, 
table_rows 
from information_schema.partitions where 
table_schema = schema() 
and table_name='trb3';
+------+------------------+-------+------------+
| part | expr | descr | table_rows |
+------+------------------+-------+------------+
| p0 | YEAR(purchased) | NULL | 731 |
| p1 | YEAR(purchased) | NULL | 365 |
| p2 | YEAR(purchased) | NULL | 365 |
| p3 | YEAR(purchased) | NULL | 365 |
| p4 | YEAR(purchased) | NULL | 366 |
| p5 | YEAR(purchased) | NULL | 730 |
| p6 | YEAR(purchased) | NULL | 730 |
| p7 | YEAR(purchased) | NULL | 730 |
| p8 | YEAR(purchased) | NULL | 732 |
| p9 | YEAR(purchased) | NULL | 730 |
| p10 | YEAR(purchased) | NULL | 730 |
| p11 | YEAR(purchased) | NULL | 730 |
+------+------------------+-------+------------+
12 rows in set (0.00 sec)</pre>
<h4 id="縮建分區(qū)從12個到8個">縮建分區(qū)從12個到8個</h4>
<pre class="brush:sql;">mysql> ALTER TABLE trb3 COALESCE PARTITION 4;
Query OK, 7304 rows affected (0.13 sec)
Records: 7304 Duplicates: 0 Warnings: 0
select 
partition_name part, 
partition_expression expr, 
partition_description descr, 
table_rows 
from information_schema.partitions where 
table_schema = schema() 
and table_name='trb3';
+------+------------------+-------+------------+
| part | expr | descr | table_rows |
+------+------------------+-------+------------+
| p0 | YEAR(purchased) | NULL | 732 |
| p1 | YEAR(purchased) | NULL | 1095 |
| p2 | YEAR(purchased) | NULL | 1095 |
| p3 | YEAR(purchased) | NULL | 1095 |
| p4 | YEAR(purchased) | NULL | 1097 |
| p5 | YEAR(purchased) | NULL | 730 |
| p6 | YEAR(purchased) | NULL | 730 |
| p7 | YEAR(purchased) | NULL | 730 |
+------+------------------+-------+------------+
8 rows in set (0.00 sec)
mysql> select count(*) from trb3;
+----------+
| count(*) |
+----------+
| 7304 |
+----------+
1 row in set (0.00 sec)</pre>
<p>沒丟數(shù)據(jù)</p>
<p>收縮前2004年在P0</p>
<pre class="brush:sql;">mysql> select mod(2004,12);
+--------------+
| mod(2004,12) |
+--------------+
| 0 |
+--------------+</pre>
<p>收縮后2004年在P4</p>
<pre class="brush:sql;">mysql> select mod(2004,8);
+-------------+
| mod(2004,8) |
+-------------+
| 4 |
+-------------+</pre>
<h3 id="exchanging-partitions-and-subpartitions-with-tables">Exchanging Partitions and Subpartitions with Tables</h3>
<h3 id="分區(qū)子分區(qū)交換">分區(qū)(子分區(qū))交換</h3>
<pre class="brush:sql;"> ALTER TABLE pt EXCHANGE PARTITION p WITH TABLE nt</pre>
<p>pt是一個分區(qū)表,p是pt的分區(qū)或子分區(qū),而nt是一個非分區(qū)表</p>
<h4 id="限制條件">限制條件:</h4>
<p>1.表nt不是分區(qū)表<br>
2.表nt不是臨時表<br>
3.表pt和nt結構在其他方面是相同的<br>
4.表n沒有外鍵約束,也沒有其他表引用它的列為外鍵<br>
5.表nt的所有行都包含在表p的分區(qū)范圍內(nèi)(比如p range分區(qū)最大values less than 10,那么表nt不能有大于等于10的值)</p>
<h4 id="權限">權限:</h4>
<p>除了 ALTER, INSERT, and CREATE 權限外,你還要有DROP權限才能執(zhí)行ALTER TABLE … EXCHANGE PARTITION.</p>
<h4 id="其他注意事項">其他注意事項:</h4>
<p>1.執(zhí)行ALTER TABLE … EXCHANGE PARTITION 不會調用任何在nt表和p表上的觸發(fā)器<br>
2.在交換表中的任何AUTO_INCREMENT列會被reset<br>
3.IGNORE關鍵字在執(zhí)行ALTER TABLE … EXCHANGE PARTITION時會失效</p>
<h4 id="完整實例語句如下">完整實例語句如下:</h4>
<pre class="brush:sql;">ALTER TABLE pt 
EXCHANGE PARTITION p 
WITH TABLE nt;</pre>
<p>在一次ALTER TABLE EXCHANGE PARTITION 中,只能有一個分區(qū)和一個非分區(qū)表被交換<br>
想交換多個,就執(zhí)行多次ALTER TABLE EXCHANGE PARTITION<br>
任何MySQL支持的分區(qū)類型都可以進行交換</p>
<h4 id="交換實例">交換實例</h4>
<pre class="brush:sql;">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");</pre>
<p>創(chuàng)建一個與e結構一樣的非分區(qū)表e2</p>
<pre class="brush:sql;">mysql> create table e2 like e;
Query OK, 0 rows affected (0.01 sec)
mysql> show create table e2\G
*************************** 1. row ***************************
Table: e2
Create Table: CREATE TABLE `e2` (
`id` int(11) NOT NULL,
`fname` varchar(30) DEFAULT NULL,
`lname` varchar(30) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8
/*!50100 PARTITION BY RANGE (id)
(PARTITION p0 VALUES LESS THAN (50) ENGINE = InnoDB,
PARTITION p1 VALUES LESS THAN (100) ENGINE = InnoDB,
PARTITION p2 VALUES LESS THAN (150) ENGINE = InnoDB,
PARTITION p3 VALUES LESS THAN MAXVALUE ENGINE = InnoDB) */
1 row in set (0.00 sec)
mysql> alter table e2 remove partitioning;
Query OK, 0 rows affected (0.02 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> show create table e2\G
*************************** 1. row ***************************
Table: e2
Create Table: CREATE TABLE `e2` (
`id` int(11) NOT NULL,
`fname` varchar(30) DEFAULT NULL,
`lname` varchar(30) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8
1 row in set (0.00 sec)</pre>
<p>查看數(shù)據(jù)在e表中的分布:</p>
<pre class="brush:sql;">select 
partition_name part, 
partition_expression expr, 
partition_description descr, 
table_rows 
from information_schema.partitions where 
table_schema = schema() 
and table_name='e'
+------+------+----------+------------+
| part | expr | descr | table_rows |
+------+------+----------+------------+
| p0 | id | 50 | 1 |
| p1 | id | 100 | 0 |
| p2 | id | 150 | 0 |
| p3 | id | MAXVALUE | 3 |
+------+------+----------+------------+
4 rows in set (0.00 sec)</pre>
<p>將分區(qū)p0與e2表進行交換:</p>
<pre class="brush:sql;">mysql> ALTER TABLE e EXCHANGE PARTITION p0 WITH TABLE e2;
Query OK, 0 rows affected (0.01 sec)
select 
partition_name part, 
partition_expression expr, 
partition_description descr, 
table_rows 
from information_schema.partitions where 
table_schema = schema() 
and table_name='e';
+------+------+----------+------------+
| part | expr | descr | table_rows |
+------+------+----------+------------+
| p0 | id | 50 | 0 |
| p1 | id | 100 | 0 |
| p2 | id | 150 | 0 |
| p3 | id | MAXVALUE | 3 |
+------+------+----------+------------+
4 rows in set (0.01 sec)
mysql> select * from e2;
+----+-------+-------+
| id | fname | lname |
+----+-------+-------+
| 16 | Frank | White |
+----+-------+-------+
1 row in set (0.00 sec) </pre>
<p>重做實驗,這次在交換前在表e2中插入一些數(shù)據(jù)</p>
<pre class="brush:sql;">mysql> insert into e2 values(16,'FAN','BOSHI');
Query OK, 1 row affected (0.00 sec)
mysql> insert into e2 values(51,'DU','YALAN');
Query OK, 1 row affected (0.00 sec)
mysql> select * from e2;
+----+-------+-------+
| id | fname | lname |
+----+-------+-------+
| 16 | FAN | BOSHI |
| 51 | DU | YALAN |
+----+-------+-------+
2 rows in set (0.00 sec)
mysql> ALTER TABLE e EXCHANGE PARTITION p0 WITH TABLE e2;
ERROR 1737 (HY000): Found a row that does not match the partition</pre>
<p>報錯了,因為51超出了p0的范圍。<br>
如之前所說,此時使用IGNORE也無濟于事</p>
<pre class="brush:sql;">mysql> ALTER IGNORE TABLE e EXCHANGE PARTITION p0 WITH TABLE e2;
ERROR 1737 (HY000): Found a row that does not match the partition</pre>
<p>修改id為49,這樣就屬于p0的范圍了</p>
<pre class="brush:sql;">mysql> update e2 set id=49 where id=51;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0
mysql> ALTER TABLE e EXCHANGE PARTITION p0 WITH TABLE e2;
Query OK, 0 rows affected (0.01 sec)
mysql> select 
-> partition_name part, 
-> partition_expression expr, 
-> partition_description descr, 
-> table_rows 
-> from information_schema.partitions where 
-> table_schema = schema() 
-> and table_name='e';
+------+------+----------+------------+
| part | expr | descr | table_rows |
+------+------+----------+------------+
| p0 | id | 50 | 2 |
| p1 | id | 100 | 0 |
| p2 | id | 150 | 0 |
| p3 | id | MAXVALUE | 3 |
+------+------+----------+------------+
4 rows in set (0.00 sec)
e2的數(shù)據(jù)被交換到了p0中
mysql> select * from e partition(p0);
+----+-------+-------+
| id | fname | lname |
+----+-------+-------+
| 16 | FAN | BOSHI |
| 49 | DU | YALAN |
+----+-------+-------+
2 rows in set (0.00 sec)
e的p0分區(qū)中的數(shù)據(jù)被交換到了e2中
mysql> select * from e2;
+----+-------+-------+
| id | fname | lname |
+----+-------+-------+
| 16 | Frank | White |
+----+-------+-------+
1 row in set (0.01 sec)</pre>
<h4 id="交換subpartition">交換subpartition</h4>
<pre class="brush:sql;">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)
);
INSERT INTO es VALUES
(1669, "Jim", "Smith"),
(337, "Mary", "Jones"),
(16, "Frank", "White"),
(2005, "Linda", "Black");
CREATE TABLE es2 LIKE es;
ALTER TABLE es2 REMOVE PARTITIONING;</pre>
<p>盡管我們沒有顯示的指定每個子分區(qū)的名字,我們?nèi)钥梢酝ㄟ^information_schema.partitions表獲取到子分區(qū)的名字</p>
<pre class="brush:sql;">select 
partition_name part, 
subpartition_name, 
partition_expression expr, 
partition_description descr, 
table_rows 
from information_schema.partitions where 
table_schema = schema() 
and table_name='es';
+------+-------------------+------+----------+------------+
| part | subpartition_name | expr | descr | table_rows |
+------+-------------------+------+----------+------------+
| p0 | p0sp0 | id | 50 | 1 |
| p0 | p0sp1 | id | 50 | 0 |
| p1 | p1sp0 | id | 100 | 0 |
| p1 | p1sp1 | id | 100 | 0 |
| p2 | p2sp0 | id | 150 | 0 |
| p2 | p2sp1 | id | 150 | 0 |
| p3 | p3sp0 | id | MAXVALUE | 3 |
| p3 | p3sp1 | id | MAXVALUE | 0 |
+------+-------------------+------+----------+------------+</pre>
<p>接下來,開始將p3sp0和es進行交換</p>
<pre class="brush:sql;">mysql> select * from es partition(p3sp0);
+------+-------+-------+
| id | fname | lname |
+------+-------+-------+
| 1669 | Jim | Smith |
| 337 | Mary | Jones |
| 2005 | Linda | Black |
+------+-------+-------+
3 rows in set (0.00 sec)
mysql> ALTER TABLE es EXCHANGE PARTITION p3sp0 WITH TABLE es2;
Query OK, 0 rows affected (0.00 sec)
mysql> select * from es partition(p3sp0);
Empty set (0.00 sec)
mysql> select * from es2;
+------+-------+-------+
| id | fname | lname |
+------+-------+-------+
| 1669 | Jim | Smith |
| 337 | Mary | Jones |
| 2005 | Linda | Black |
+------+-------+-------+
3 rows in set (0.00 sec)</pre>
<p>如果一個分區(qū)表有子分區(qū),那么你只能以子分區(qū)為粒度進行交換,而不能直接交換子分區(qū)的父分區(qū)</p>
<pre class="brush:sql;">mysql> ALTER TABLE es EXCHANGE PARTITION p3 WITH TABLE es2;
ERROR 1704 (HY000): Subpartitioned table, use subpartition instead of partition</pre>
<p>EXCHANGE PARTITION有著嚴格的要求<br>
兩個將要交換的表的 列名,列的創(chuàng)建順序,列的數(shù)量,以及索引都要嚴格一致。當然存儲引擎也要一致</p>
<pre class="brush:sql;">mysql> desc es2;
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id | int(11) | NO | | NULL | |
| fname | varchar(30) | YES | | NULL | |
| lname | varchar(30) | YES | | NULL | |
+-------+-------------+------+-----+---------+-------+
3 rows in set (0.00 sec)
mysql> create index id_name on es2(id,fname);
Query OK, 0 rows affected (0.01 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> ALTER TABLE es EXCHANGE PARTITION p3sp0 WITH TABLE es2;
ERROR 1736 (HY000): Tables have different definitions</pre>
<p>改變es2的存儲引擎</p>
<pre class="brush:sql;">mysql> drop index id_name on es2;
Query OK, 0 rows affected (0.00 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> alter table es2 engine=myisam;
Query OK, 0 rows affected (0.01 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> ALTER TABLE es EXCHANGE PARTITION p3sp0 WITH TABLE es2;
ERROR 1497 (HY000): The mix of handlers in the partitions is not allowed in this version of MySQL</pre>
<h3 id="分區(qū)表的維護">分區(qū)表的維護</h3>
<p>CHECK TABLE, OPTIMIZE TABLE, ANALYZE TABLE, and REPAIR TABLE可以被用于維護分區(qū)表</p>
<p>Rebuilding partitions.相當于將分區(qū)中的數(shù)據(jù)drop掉再插入回來,對于避免磁盤碎片很有效<br>
Example:</p>
<pre class="brush:sql;">ALTER TABLE t1 REBUILD PARTITION p0, p1;</pre>
<p>Optimizing partitions.如果你的表增加刪除了大量數(shù)據(jù),或者進行了大量的邊長列的更新操作( VARCHAR, BLOB, or TEXT columns)。那么optimize partition將回收未使用的空間,并整理分區(qū)數(shù)據(jù)文件。<br>
Example:</p>
<pre class="brush:sql;">ALTER TABLE t1 OPTIMIZE PARTITION p0, p1;</pre>
<p>運行OPTIMIZE PARTITION 相當于做了 CHECK PARTITION, ANALYZE PARTITION, and REPAIR PARTITION</p>
<blockquote>
<p>Some MySQL storage engines, including InnoDB, do not support per-partition optimization; in these cases, ALTER TABLE … OPTIMIZE PARTITION rebuilds the entire table. In MySQL 5.6.9 and later, running this statement on such a table causes the entire table to rebuilt and analyzed, and an appropriate warning to be issued. (Bug #11751825, Bug #42822) Use ALTER TABLE … REBUILD PARTITION and ALTER TABLE … ANALYZE PARTITION instead, to avoid this issue.</p>
</blockquote>
<p>Analyzing partitions.讀取并保存分區(qū)的鍵分布<br>
Example:</p>
<pre class="brush:sql;">ALTER TABLE t1 ANALYZE PARTITION p3;</pre>
<p>Repairing partitions.修補被破壞的分區(qū)<br>
Example:</p>
<pre class="brush:sql;">ALTER TABLE t1 REPAIR PARTITION p0,p1;</pre>
<p>Checking partitions.可以使用幾乎與對非分區(qū)表使用CHECK TABLE 相同的方式檢查分區(qū)。<br>
Example:</p>
<pre class="brush:sql;">ALTER TABLE trb3 CHECK PARTITION p1;</pre>
<p>這個命令可以告訴你表trb3的分區(qū)p1中的數(shù)據(jù)或索引是否已經(jīng)被破壞。如果發(fā)生了這種情況,使用“ALTER TABLE … REPAIR PARTITION”來修補該分區(qū)。</p>
<h4 id="以上每個命令都支持將分區(qū)換成all">以上每個命令都支持將分區(qū)換成ALL</h4>
<blockquote>
<p>The use of mysqlcheck and myisamchk is not supported with partitioned tables.</p>
</blockquote>
<p>mysqlcheck和myisamchk不支持分區(qū)表</p>
<p>你可以使用 ALTER TABLE … TRUNCATE PARTITION. 來刪除一個或多個分區(qū)中的數(shù)據(jù)<br>
如:ALTER TABLE … TRUNCATE PARTITION ALL刪除所有數(shù)據(jù)</p>
<p>ANALYZE, CHECK, OPTIMIZE, REBUILD, REPAIR, and TRUNCATE 操作不支持 subpartitions.</p>
</enddate>

以上所述是小編給大家介紹的Mysql分區(qū)表的管理與維護,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!

相關文章

  • Linux下徹底卸載mysql詳解

    Linux下徹底卸載mysql詳解

    如何在Linux下徹底的卸載MySQL數(shù)據(jù)庫呢? 下面這篇文章就給大家總結、整理了一下在Linux平臺下徹底卸載MySQL的方法。 文中通過圖文及示例代碼介紹的很詳細,相信對大家的理解和學習很有幫助,下面有需要的朋友們來一起學習學習吧。
    2016-11-11
  • Centos MySQL 5.7安裝、升級教程

    Centos MySQL 5.7安裝、升級教程

    這篇文章主要為大家詳細介紹了Centos MySQL 5.7安裝、升級教程,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-01-01
  • mysql 行列轉換的示例代碼

    mysql 行列轉換的示例代碼

    這篇文章主要介紹了mysql 行列轉換的示例代碼,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-03-03
  • mysql中binlog_format模式與配置詳細分析

    mysql中binlog_format模式與配置詳細分析

    這篇文章主要介紹了mysql中binlog_format模式與配置的相關內(nèi)容,詳細介紹了binlog的三種格式與SBR、 RBR 兩種模式各自的優(yōu)缺點,需要的朋友可以參考。
    2017-10-10
  • 驗證mysql是否安裝成功的方法

    驗證mysql是否安裝成功的方法

    在本篇文章里小編給大家分享的是關于驗證mysql是否安裝成功的方法,需要的朋友們可以學習下。
    2020-06-06
  • MySQL七種JOIN類型小結

    MySQL七種JOIN類型小結

    今天給大家介紹MySQL七種JOIN類型詳解,本文通過sql語句給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-10-10
  • MySQL數(shù)據(jù)庫Event定時執(zhí)行任務詳解

    MySQL數(shù)據(jù)庫Event定時執(zhí)行任務詳解

    這篇文章主要介紹了MySQL數(shù)據(jù)庫Event定時執(zhí)行任務
    2017-12-12
  • MySQL的prepare使用及遇到bug解析過程

    MySQL的prepare使用及遇到bug解析過程

    在一次開發(fā)中使用 MySQL PREPARE 以后,從 prepare 直接取 name 賦值給 lex->prepared_stmt_name 然后給 EXECUTE 用,發(fā)現(xiàn)有一定概率找不到 prepare stmt 的 name,于是開始動手調查問題發(fā)生的原因,本文給大家分享mysql prepare使用及問題解決,感興趣的朋友一起看看吧
    2022-05-05
  • mysqlhotcopy 正則使用小技巧

    mysqlhotcopy 正則使用小技巧

    mysqlhotcopy 是MySQL的熱備工具,詳細請看手冊 ,為了安全起見我們給熱備分配個用戶
    2011-08-08
  • MySQL登錄、訪問及退出操作實戰(zhàn)指南

    MySQL登錄、訪問及退出操作實戰(zhàn)指南

    當我們要使用mysql時,一定要了解mysql的登錄、訪問及退出,下面這篇文章主要給大家介紹了關于MySQL登錄、訪問及退出操作的相關資料,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考下
    2022-10-10

最新評論