mysql的分區技巧具體引見。本站提示廣大學習愛好者:(mysql的分區技巧具體引見)文章只能為提供參考,不一定能成為您想要的結果。以下是mysql的分區技巧具體引見正文
1、概述
當 MySQL的總記載數跨越了100萬後,會湧現機能的年夜幅度降低嗎?謎底是確定的,然則,機能降低>的比率紛歧而同,要看體系的架構、運用法式、還有>包含索引、辦事器硬件等多種身分而定。當有網友問我這個成績的時刻,我最多見的答復>就是:分表,可以依據id區間或許時光前後次序等多種規矩來分表。分表很輕易,但是由此所帶來的運用法式乃至是架構方面的修改任務卻不>容小觑,還包含未來的擴大性等。
在之前,一種處理計劃就是應用 MERGE
類型,這是一個異常便利的做飯。架構和法式根本上不消做修改,不外,它的缺陷是顯見的:
1.只能在雷同構造的 MyISAM 表上應用
2.沒法享用到 MyISAM 的全體功效,例如沒法在 MERGE 類型上履行 FULLTEXT 搜刮
3.它須要應用更多的文件描寫符
4.讀取索引更慢
這個時刻,MySQL 5.1 中新增的分區(Partition)功效的優勢也就很顯著了:
1.與單個磁盤或文件體系分區比擬,可以存儲更多的數據
2.很輕易就可以刪除不消或許過時的數據
3.一些查詢可以獲得極年夜的優化
4.觸及到 SUM()/COUNT() 等聚合函數時,可以並行停止
5.IO吞吐量更年夜
分區許可可以設置為隨意率性年夜小的規矩,跨文件體系分派單個表的多個部門。現實上,表的分歧部門在分歧的地位被存儲為零丁的表。
分區應當留意的事項:
1、 做分區時,要末不界說主鍵,要末把分區字段參加到主鍵中。
2、 分區字段不克不及為NULL,要否則怎樣肯定分區規模呢,所以盡可能NOT NULL
2、分區的類型
1.RANGE 分區:基於屬於一個給定持續區間的列值,把多行分派給分區。
2.LIST 分區:相似於按RANGE分區,差別在於LIST分區是基於列值婚配一個團圓值聚集中的某個值來停止選擇。
2.HASH分區:基於用戶界說的表達式的前往值來停止選擇的分區,該表達式應用將要拔出到表中的這些行的列值停止盤算。這個函數可以包>含MySQL中有用的、發生非負整數值的任何表達式。
3.KEY分區:相似於按HASH分區,差別在於KEY分區只支撐盤算一列或多列,且MySQL辦事器供給其本身的哈希函數。必需有一列或多列包括>整數值。
可以經由過程應用SHOW VARIABLES敕令來肯定MySQL能否支撐分區,例如:
mysql> SHOW VARIABLES LIKE '%partition%';
+-----------------------+-------+
| Variable_name | Value |
+-----------------------+-------+
| have_partition_engine | YES |
+-----------------------+-------+
1 row in set (0.00 sec)
mysql> SHOW VARIABLES LIKE '%partition%';
+-----------------------+-------+
| Variable_name | Value |
+-----------------------+-------+
| have_partition_engine | YES |
+-----------------------+-------+
1 row in set (0.00 sec)
1、range分區
create table t_range(
id int(11),
money int(11) unsigned not null,
date datetime
)partition by range(year(date))(
partition p2007 values less than (2008),
partition p2008 values less than (2009),
partition p2009 values less than (2010)
partition p2010 values less than maxvalue
);
2.list分區
create table t_list(
a int(11),
b int(11)
)(partition by list (b)
partition p0 values in (1,3,5,7,9),
partition p1 values in (2,4,6,8,0)
);
關於innodb和myisam引擎,一條語句拔出多筆記錄的時刻,假如中央有值不克不及拔出,innodb會全體回滾,myisam在毛病值之前的數據可以拔出到表中。關於innodb和myisam引擎,一條語句拔出多筆記錄的時刻,假如中央有值不克不及拔出,innodb會全體回滾,myisam在毛病值之前的數據可以拔出到表中。
3.hash分區
hash分區的目標是將數據平均的散布到事後界說的各個分區中,包管各分區的數據量年夜致分歧。
create table t_hash(
a int(11),
b datetime
)partition by hash (YEAR(b)
partitions 4;
hash的分區函數頁須要前往一個整數值。partitions子句中的值是一個非負整數,不加的partitions子句的話,默許為分區數為1。
4.key分區
key分區和hash分區類似,分歧在於hash分區是用戶自界說函數停止分區,key分區應用mysql數據庫供給的函數停止分區,NDB cluster應用MD5函數來分區,關於其他存儲引擎mysql應用外部的hash函數,這些函數基於password()一樣的算法。
create table t_key(
a int(11),
b datetime)
partition by key (b)
partitions 4;
5。columns分區
下面的RANGE、LIST、HASH、KEY四種分區中,分區的前提必需是整形,假如不是整形須要經由過程函數將其轉換為整形。
mysql-5.5開端支撐COLUMNS分區,可視為RANGE和LIST分區的退化,COLUMNS分區可以直接應用非整形數據停止分區。COLUMNS分區支撐以下數據類型:
一切整形,如INT SMALLINT TINYINT BIGINT。FLOAT和DECIMAL則不支撐。
日期類型,如DATE和DATETIME。其他日期類型不支撐。
字符串類型,如CHAR、VARCHAR、BINARY和VARBINARY。BLOB和TEXT類型不支撐。
COLUMNS可使用多個列停止分區。
新增分區
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> ALTER TABLE sale_data DROP PARTITION p201010;
Query OK, 0 rows affected (0.22 sec)
Records: 0 Duplicates: 0 Warnings: 0
分區的歸並
上面的SQL,將p201001 - p201009 歸並為3個分區p2010Q1 - p2010Q3
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