中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

MySQL的分區(一)

發布時間:2020-08-11 19:14:47 來源:ITPUB博客 閱讀:236 作者:to_be_Dba 欄目:MySQL數據庫

mysql支持范圍分區(range)、列表分區(list)、column分區、哈希分區(hash)、key分區、字段列表分區等

以timestamp類型字段作為分區鍵進行范圍分區,有兩種方式:

CREATE TABLE quarterly_report_status (

report_id INT NOT NULL,

report_status VARCHAR(20) NOT NULL,

report_updated TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP

)

PARTITION BY RANGE ( UNIX_TIMESTAMP(report_updated) ) (

PARTITION p0 VALUES LESS THAN ( UNIX_TIMESTAMP('2008-01-01 00:00:00') ),

PARTITION p1 VALUES LESS THAN ( UNIX_TIMESTAMP('2008-04-01 00:00:00') ),

PARTITION p2 VALUES LESS THAN ( UNIX_TIMESTAMP('2008-07-01 00:00:00') ),

PARTITION p3 VALUES LESS THAN ( UNIX_TIMESTAMP('2008-10-01 00:00:00') ),

PARTITION p4 VALUES LESS THAN ( UNIX_TIMESTAMP('2009-01-01 00:00:00') ),

PARTITION p5 VALUES LESS THAN ( UNIX_TIMESTAMP('2009-04-01 00:00:00') ),

PARTITION p6 VALUES LESS THAN ( UNIX_TIMESTAMP('2009-07-01 00:00:00') ),

PARTITION p7 VALUES LESS THAN ( UNIX_TIMESTAMP('2009-10-01 00:00:00') ),

PARTITION p8 VALUES LESS THAN ( UNIX_TIMESTAMP('2010-01-01 00:00:00') ),

PARTITION p9 VALUES LESS THAN (MAXVALUE)

);

CREATE TABLE members (

    firstname VARCHAR(25) NOT NULL,

    lastname VARCHAR(25) NOT NULL,

    username VARCHAR(16) NOT NULL,

    email VARCHAR(35),

    joined DATE NOT NULL

)

PARTITION BY RANGE( YEAR(joined) ) (

    PARTITION p0 VALUES LESS THAN (1960),

    PARTITION p1 VALUES LESS THAN (1970),

    PARTITION p2 VALUES LESS THAN (1980),

    PARTITION p3 VALUES LESS THAN (1990),

    PARTITION p4 VALUES LESS THAN MAXVALUE

);

在mysql5.7中timestamp范圍分區表只能使用上面兩種格式,使用to_days可能觸發bug。

date類型的分區:

CREATE TABLE members (

    firstname VARCHAR(25) NOT NULL,

    lastname VARCHAR(25) NOT NULL,

    username VARCHAR(16) NOT NULL,

    email VARCHAR(35),

    joined DATE NOT NULL

)

PARTITION BY RANGE COLUMNS(joined) (

    PARTITION p0 VALUES LESS THAN ('1960-01-01'),

    PARTITION p1 VALUES LESS THAN ('1970-01-01'),

    PARTITION p2 VALUES LESS THAN ('1980-01-01'),

    PARTITION p3 VALUES LESS THAN ('1990-01-01'),

    PARTITION p4 VALUES LESS THAN MAXVALUE

);

使用列表分區的實例:

CREATE TABLE employees (

id INT NOT NULL,

fname VARCHAR(30),

lname VARCHAR(30),

hired DATE NOT NULL DEFAULT '1970-01-01',

separated DATE NOT NULL DEFAULT '9999-12-31',

job_code INT,

store_id INT

)

PARTITION BY LIST(store_id) (

PARTITION pNorth VALUES IN (3,5,6,9,17),

PARTITION pEast VALUES IN (1,2,10,11,19,20),

PARTITION pWest VALUES IN (4,12,13,14,18),

PARTITION pCentral VALUES IN (7,8,15,16)

);

使用ignore關鍵字,可以在插入多條數據時忽略沒有匹配分區的數據,不報錯:

mysql> CREATE TABLE h3 (

-> c1 INT,

-> c2 INT

-> )

-> PARTITION BY LIST(c1) (

-> PARTITION p0 VALUES IN (1, 4, 7),

-> PARTITION p1 VALUES IN (2, 5, 8)

-> );

Query OK, 0 rows affected (0.11 sec)

mysql> INSERT INTO h3 VALUES (3, 5);

ERROR 1525 (HY000): Table has no partition for value 3

mysql> INSERT IGNORE INTO h3 VALUES (2, 5), (6, 10), (7, 5), (3, 1), (1, 9);

Query OK, 3 rows affected (0.00 sec)

Records: 5 Duplicates: 2 Warnings: 0

mysql> SELECT * FROM h3;

+------+------+

| c1 | c2 |

+------+------+

| 7 | 5 |

| 1 | 9 |

| 2 | 5 |

+------+------+

3 rows in set (0.00 sec)

可以在定義表時指定分區屬性,也可以使用alter table進行修改:

ALTER TABLE employees PARTITION BY RANGE COLUMNS (lname) (

PARTITION p0 VALUES LESS THAN ('g'),

PARTITION p1 VALUES LESS THAN ('m'),

PARTITION p2 VALUES LESS THAN ('t'),

PARTITION p3 VALUES LESS THAN (MAXVALUE)

);

range columns不支持表達式,僅支持一或多個列名。

由于字符集character sets和collations的排列順序不同,當進行數據遷移或者修改庫、表、列的字符集時,

有可能因此而出現報錯。比如對于大小寫不敏感的collation,and排列順序在Andersen之前,

但對于大小寫敏感的collation就不是。

使用多個字段分區時,是按照字段順序進行比較的,以下語句正確:

CREATE TABLE rc4 (

    a INT,

    b INT,

    c INT

)

PARTITION BY RANGE COLUMNS(a,b,c) (

    PARTITION p0 VALUES LESS THAN (0,25,50),

    PARTITION p1 VALUES LESS THAN (10,20,100),

    PARTITION p2 VALUES LESS THAN (10,30,50)

    PARTITION p3 VALUES LESS THAN (MAXVALUE,MAXVALUE,MAXVALUE)

 );

但不建議使用此分區方式。

哈希分區實例:

CREATE TABLE employees (

id INT NOT NULL,

fname VARCHAR(30),

lname VARCHAR(30),

hired DATE NOT NULL DEFAULT '1970-01-01',

separated DATE NOT NULL DEFAULT '9999-12-31',

job_code INT,

store_id INT

)

PARTITION BY HASH(store_id)

PARTITIONS 4;

限制:

分區鍵必須是數字類型(integer)

分區鍵必須是主鍵和所有唯一鍵的一部分

需要指定分區數,否則默認是1

數據放入哪個分區是固定且可以提前計算的。比如:

CREATE TABLE t1 (col1 INT, col2 CHAR(5), col3 DATE)

    PARTITION BY HASH( YEAR(col3) )

    PARTITIONS 4;

如果col3的值為'2005-09-15',數據放入哪個分區的計算公式為:

MOD(YEAR('2005-09-01'),4)

=  MOD(2005,4)

=  1

即放入第一個分區

線性分區(LINER HASH PARTITION),與普通hash分區的區別是其采用線性二次冪算法,公式為:

V = POWER(2, CEILING(LOG(2, num)))

語句舉例:

CREATE TABLE employees (

id INT NOT NULL,

fname VARCHAR(30),

lname VARCHAR(30),

hired DATE NOT NULL DEFAULT '1970-01-01',

separated DATE NOT NULL DEFAULT '9999-12-31',

job_code INT,

store_id INT

)

PARTITION BY LINEAR HASH( YEAR(hired) )

PARTITIONS 4;

key分區

與hash分區類似,只是算法不同。對于NDB cluster,使用md5()函數,其他引擎使用類似password()函數進行分區。

舉例:

CREATE TABLE tm1 (

    s1 CHAR(32) PRIMARY KEY

)

PARTITION BY KEY(s1)

PARTITIONS 10;

key鍵必須是主鍵的一部分。當存在主鍵或非空唯一鍵時,也可以為空。

復合分區/子分區

mysql5.7中分區類型為range或list,子分區可以使用hash或key分區。

有以下限制:

每個分區中的子分區數量必須一樣;

子分區名稱不能重復;

################################

分區表中NULL的處理

在range分區表中,NULL被認為小于所有值,被存放在第一個分區中;

LIST分區表中,必須指定某個分區包含NULL值;

在hash或key分區表中,NULL被當作0處理。

#############################

分區管理

range和list分區表可以進行分區的增、刪、合并、拆分操作

增刪分區的邏輯和寫法與oracle基本一致。拆分/分裂分區的語法:

ALTER TABLE members

REORGANIZE PARTITION p0 INTO (

PARTITION n0 VALUES LESS THAN (1970),

PARTITION n1 VALUES LESS THAN (1980)

);

hash和key分區表不能進行刪除,但可以合并,如:

ALTER TABLE clients COALESCE PARTITION 4;

其中4是待刪除的分區數量。

添加6個分區分區,如:

ALTER TABLE clients ADD PARTITION PARTITIONS 6;

分區交換(用于range分區或子分區)

類似oracle,對分區表的某個分區與普通表進行交換。例如:

ALTER TABLE pt EXCHANGE PARTITION p WITH TABLE nt;

限制:

表結構一致,包含索引一致

普通表不包含外鍵,也不被其他表做外鍵引用

普通表數據的范圍沒有超過分區表定義

如果是innodb引擎,要求row格式一致

未使用data directory選項

需要表的增刪改查權限

該過程不會觸發觸發器

交換時自增值會被重置

ignore選項無效

使用without validation選項時,不再逐條校驗數據

分區重建,相當于刪除所有數據再重新插入:

ALTER TABLE t1 REBUILD PARTITION p0, p1;

##############################################

分區的維護

優化分區,用于對大量數據進行修改或刪除操作后,可以回收空間并整理碎片

相當于運行了check partition、analyze partition、repair partition。

可以對多個分區一次性執行:

alter table t1 optimize partition p0,p1;

注意:innodb不支持單個分區的optimize操作,會升級為對全表的重建,如:

mysql> alter table t4 optimize partition p1;

+-------+----------+----------+---------------------------------------------------------------------------------------------+

| Table | Op       | Msg_type | Msg_text                                                                                    |

+-------+----------+----------+---------------------------------------------------------------------------------------------+

| tl.t4 | optimize | note     | Table does not support optimize on partitions. All partitions will be rebuilt and analyzed. |

| tl.t4 | optimize | status   | OK                                                                                          |

+-------+----------+----------+---------------------------------------------------------------------------------------------+

2 rows in set (4.00 sec)

可以使用ALTER TABLE ... REBUILD PARTITION和ALTER TABLE ... ANALYZE PARTITION 進行替代,避免此問題。

分析分區,讀取和存儲分區的關鍵屬性信息:

alter table t1 analyze partition p3;

修復分區

alter table t1 repair partition p0,p1;

正常執行時如果有重復鍵值會報錯;

從5.7.2開始,可以使用alter ignore table選項,出現重復值時自動刪除

檢查分區

alter table trb3 check partition p1;

檢查p1分區的數據和索引是否有中斷。如果有重復值,則check操作會報錯。

從5.7.2開始,可以使用alter ignore table選項,出現重復值時報告出來。

########################################################

獲取分區信息

show create table

show table status =>是否分區

information_schema.partitions

explain select

舉例:

mysql> show table status from tl like 't%'

    -> ;

+------+--------+---------+------------+------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+---------------------+------------+-----------------+----------+----------------+---------+

| Name | Engine | Version | Row_format | Rows | Avg_row_length | Data_length | Max_data_length | Index_length | Data_free | Auto_increment | Create_time         | Update_time         | Check_time | Collation       | Checksum | Create_options | Comment |

+------+--------+---------+------------+------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+---------------------+------------+-----------------+----------+----------------+---------+

| t1   | InnoDB |      10 | Dynamic    |    0 |              0 |       65536 |               0 |        65536 |         0 |              1 | 2020-06-18 15:35:43 | NULL                | NULL       | utf8_general_ci |     NULL | partitioned    |         |

| t2   | InnoDB |      10 | Dynamic    |   12 |           6826 |       81920 |               0 |        81920 |         0 |             30 | 2020-06-18 15:57:08 | 2020-06-18 16:01:59 | NULL       | utf8_general_ci |     NULL | partitioned    |         |

| t3   | InnoDB |      10 | Dynamic    |    9 |           1820 |       16384 |               0 |        16384 |         0 |              1 | 2020-06-18 15:55:24 | 2020-06-18 16:01:59 | NULL       | utf8_general_ci |     NULL |                |         |

| t4   | InnoDB |      10 | Dynamic    |   21 |           3900 |       81920 |               0 |        81920 |         0 |             30 | 2020-06-19 18:23:20 | NULL                | NULL       | utf8_general_ci |     NULL | partitioned    |         |

| t5   | InnoDB |      10 | Dynamic    |    0 |              0 |       49152 |               0 |        49152 |         0 |             30 | 2020-06-18 16:20:24 | 2020-06-18 16:27:30 | NULL       | utf8_general_ci |     NULL | partitioned    |         |

| tt   | InnoDB |      10 | Dynamic    |    3 |           5461 |       16384 |               0 |            0 |         0 |           NULL | 2020-06-17 23:23:00 | 2020-06-17 23:28:35 | NULL       | utf8_general_ci |     NULL |                |         |

+------+--------+---------+------------+------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+---------------------+------------+-----------------+----------+----------------+---------+

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

太仆寺旗| 玛多县| 察哈| 镇平县| 应城市| 渑池县| 荆州市| 胶州市| 河津市| 阳东县| 徐汇区| 龙川县| 天峻县| 奉贤区| 岳阳县| 保山市| 邳州市| 阳江市| 南丹县| 论坛| 汤原县| 禹州市| 远安县| 莲花县| 聊城市| 顺昌县| 哈尔滨市| 柳江县| 黄石市| 嘉祥县| 三河市| 延安市| 大竹县| 木兰县| 文山县| 桑日县| 扬中市| 贵阳市| 莱芜市| 阳泉市| 东平县|