《Mysql實例mysql使用教程之分區表的使用方法(刪除分區表)》要點:
本文介紹了Mysql實例mysql使用教程之分區表的使用方法(刪除分區表),希望對您有用。如果有疑問,可以聯系我們。
MySQL使用分區表的利益:MYSQL教程
1,可以把一些歸類的數據放在一個分區中,可以減少服務器檢查數據的數量加快查詢.
2,便利維護,通過刪除分區來刪除老的數據.
3,分區數據可以被分布到不同的物理位置,可以做分布式有效利用多個硬盤驅動器.MYSQL教程
MySQL可以樹立四種分區類型的分區:MYSQL教程
RANGE 分區:基于屬于一個給定持續區間的列值,把多行分配給分區.MYSQL教程
LIST 分區:類似于按RANGE分區,區別在于LIST分區是基于列值匹配一個離散值聚攏中的某個值來進行選擇.? www.jb51.net? MYSQL教程
HASH分區:基于用戶定義的表達式的返回值來進行選擇的分區,該表達式使用將要插入到表中的這些行的列值進行計算.這個函數可以包括MySQL 中有效的、產生非負整數值的任何表達式.MYSQL教程
KEY 分區:類似于按HASH分區,區別在于KEY分區只支持計算一列或多列,且MySQL 服務器提供其自身的哈希函數.必須有一列或多列包括整數值.MYSQL教程
一般用得多的是range分區和list分區.
RANGE分區
這里以一個銷售的業務來做測試
銷售表有日期/商品/銷售額三個字段
測試數據從2010年1月1日至2010年9月31日
以“月”為單位進行分區
初期分區定義
首先必要查看,當前數據庫是否支持分區MYSQL教程
代碼如下:
mysql>SHOW VARIABLES LIKE '%partition%';
+-------------------+-------+
| Variable_name???? | Value |
+-------------------+-------+
| have_partitioning | YES?? |
+-------------------+-------+
1 row in set (0.03 sec)
創建分區表,依照年月的方式分區.
MYSQL教程
代碼以下:
mysql> CREATE TABLE sale_data (
??? ->?? sale_date? DATETIME NOT NULL,
??? ->?? sale_item? VARCHAR(2) NOT NULL ,
??? ->?? sale_money DECIMAL(10,2) NOT NULL
??? -> )? www.jb51.net?
??? -> PARTITION BY RANGE (YEAR(sale_date)*100+MONTH(sale_date)) (
??? ->?? PARTITION p201001 VALUES LESS THAN (201002),
??? ->?? PARTITION p201002 VALUES LESS THAN (201003),
??? ->?? PARTITION p201003 VALUES LESS THAN (201004),
??? ->?? PARTITION p201004 VALUES LESS THAN (201005),
??? ->?? PARTITION p201005 VALUES LESS THAN (201006),
??? ->?? PARTITION p201006 VALUES LESS THAN (201007),
??? ->?? PARTITION p201007 VALUES LESS THAN (201008),
??? ->?? PARTITION p201008 VALUES LESS THAN (201009),
??? ->?? PARTITION p201009 VALUES LESS THAN (201010),
??? ->?? PARTITION pcatchall VLAUES LESS THAN MAXVALUE
??? -> );
Query OK, 0 rows affected (0.20 sec)
新增分區MYSQL教程
代碼如下:
mysql> ALTER TABLE sale_data
??? ->?? ADD PARTITION (PARTITION p201010 VALUES LESS THAN (201011));
Query OK, 0 rows affected (0.36 sec)
Records: 0? Duplicates: 0? Warnings: 0
刪除了分區MYSQL教程
代碼如下:
--當刪除了一個分區,也同時刪除了該分區中所有的數據.
mysql> ALTER TABLE sale_data DROP PARTITION p201010;
Query OK, 0 rows affected (0.22 sec)? www.jb51.net?
Records: 0? Duplicates: 0? Warnings: 0
分區的歸并MYSQL教程
下面的SQL,將p201001 - p201009 歸并為3個分區p2010Q1 - p2010Q3MYSQL教程
代碼以下:
mysql> ALTER TABLE sale_data
??? ->?? REORGANIZE 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)
??? -> );
Query OK, 0 rows affected (1.14 sec)
Records: 0? Duplicates: 0? Warnings: 0
分區的拆分MYSQL教程
上面的SQL,將p2010Q1 分區,拆分為s2009 與s2010 兩個分區MYSQL教程
代碼如下:
mysql> ALTER TABLE sale_data REORGANIZE PARTITION p2010Q1 INTO (
??? ->???? PARTITION s2009 VALUES LESS THAN (201001),
???????????? www.jb51.net?
??? ->???? PARTITION s2010 VALUES LESS THAN (201004)
??? -> );
Query OK, 0 rows affected (0.36 sec)
Records: 0? Duplicates: 0? Warnings: 0
一個利用分歧物理位置數據源做分區的例子:MYSQL教程
代碼如下:
CREATE TABLE ts (id INT, purchased DATE)
????ENGINE=innodb
????PARTITION BY RANGE(YEAR(purchased))
????SUBPARTITION BY HASH(id)
????(
????????PARTITION p0 VALUES LESS THAN (1990)
????????(
????????????SUBPARTITION s0????????????????? //在大的分區下又有小的分區
????????????DATA DIRECTORY='/usr/local/mysql/data0'????? //數據源
????????????INDEX DIRECTORY='/usr/local/mysql/index0',?? //索引數據源
????????????SUBPARTITION s1
????????????DATA DIRECTORY='/usr/local/mysql/data1'
????????????INDEX DIRECTORY='/usr/local/mysql/index1'
????????),
????????PARTITION p1 VALUES LESS THAN (MAXVALUE)
????????(
????????????SUBPARTITION s2
????????????DATA DIRECTORY='/usr/local/mysql/data1'
????????????INDEX DIRECTORY='/usr/local/mysql/index1',
????????????SUBPARTITION s3
????????????DATA DIRECTORY='/usr/local/mysql/data2'
????????????INDEX DIRECTORY='/usr/local/mysql/index2'
????????)
????);
分區索引的局限:
1,所有分區都要使用同樣的引擎.
2,分區表的每一個唯一索引必須包括由分區函數引用的列.
3,mysql能避免查詢所有的分區,但仍然鎖定了所有分區.
4,分區函數能使用的函數和表達式有限,例如函數有上面的4種.
5,分區不支持外鍵.? www.jb51.net?
6,不能使用LOAD INDEX INTO CACHE
7,分區并不能總是改善性能,要進行性能評測.
例如可以使用expalin partitions 來查看查詢語句是否使用分區過濾了數據:
MYSQL教程
代碼以下:
mysql> explain partitions select * from fenqubiao where day<'2011-09-12';
+----+-------------+-----------+---------------+------+---------------+------+---------+------+------+-------------+
| id | select_type | table???? | partitions??? | type | possible_keys | key? | key_len | ref? | rows | Extra?????? |
+----+-------------+-----------+---------------+------+---------------+------+---------+------+------+-------------+
|? 1 | SIMPLE????? | fenqubiao | p_2010,p_2011 | ALL? | NULL????????? | NULL | NULL??? | NULL |??? 2 | Using where |
+----+-------------+-----------+---------------+------+---------------+------+---------+------+------+-------------+
1 row in set (0.00 sec)
歡迎參與《Mysql實例mysql使用教程之分區表的使用方法(刪除分區表)》討論,分享您的想法,維易PHP學院為您提供專業教程。
轉載請注明本頁網址:
http://www.snjht.com/jiaocheng/13293.html