《Mysql學習mysql的分區技術詳細介紹》要點:
本文介紹了Mysql學習mysql的分區技術詳細介紹,希望對您有用。如果有疑問,可以聯系我們。
MYSQL應用一、概述
MYSQL應用當 MySQL的總記錄數超過了100萬后,會出現性能的大幅度下降嗎?答案是肯定的,但是,性能下降>的比率不一而同,要看系統的架構、應用程序、還有>包括索引、服務器硬件等多種因素而定.當有網友問我這個問題的時候,我最常見的回答>就是:分表,可以根據id區間或者時間先后順序等多種規則來分表.分表很容易,然而由此所帶來的應用程序甚至是架構方面的改動工作卻不>容小覷,還包括將來的擴展性等.
MYSQL應用在以前,一種解決方案就是使用 MERGE
類型,這是一個非常方便的做飯.架構和程序基本上不用做改動,不過,它的缺點是顯見的:
MYSQL應用1.只能在相同結構的 MyISAM 表上使用
2.無法享受到 MyISAM 的全部功能,例如無法在 MERGE 類型上執行 FULLTEXT 搜索
3.它需要使用更多的文件描述符
4.讀取索引更慢
MYSQL應用這個時候,MySQL 5.1 中新增的分區(Partition)功能的優勢也就很明顯了:
MYSQL應用1.與單個磁盤或文件系統分區相比,可以存儲更多的數據
2.很容易就能刪除不用或者過時的數據
3.一些查詢可以得到極大的優化
4.涉及到 SUM()/COUNT() 等聚合函數時,可以并行進行
5.IO吞吐量更大
MYSQL應用分區允許可以設置為任意大小的規則,跨文件系統分配單個表的多個部分.實際上,表的不同部分在不同的位置被存儲為單獨的表.
MYSQL應用分區應該注意的事項:
MYSQL應用1、 做分區時,要么不定義主鍵,要么把分區字段加入到主鍵中.
2、 分區字段不能為NULL,要不然怎么確定分區范圍呢,所以盡量NOT NULL
MYSQL應用二、分區的類型
MYSQL應用1.RANGE 分區:基于屬于一個給定連續區間的列值,把多行分配給分區.
2.LIST 分區:類似于按RANGE分區,區別在于LIST分區是基于列值匹配一個離散值集合中的某個值來進行選擇.
2.HASH分區:基于用戶定義的表達式的返回值來進行選擇的分區,該表達式使用將要插入到表中的這些行的列值進行計算.這個函數可以包>含MySQL中有效的、產生非負整數值的任何表達式.
3.KEY分區:類似于按HASH分區,區別在于KEY分區只支持計算一列或多列,且MySQL服務器提供其自身的哈希函數.必須有一列或多列包含>整數值.
MYSQL應用可以通過使用SHOW VARIABLES命令來確定MySQL是否支持分區,例如:
MYSQL應用1、range分區
MYSQL應用2.list分區
MYSQL應用對于innodb和myisam引擎,一條語句插入多條記錄的時候,如果中間有值不能插入,innodb會全部回滾,myisam在錯誤值之前的數據可以插入到表中.對于innodb和myisam引擎,一條語句插入多條記錄的時候,如果中間有值不能插入,innodb會全部回滾,myisam在錯誤值之前的數據可以插入到表中.
MYSQL應用3.hash分區
MYSQL應用hash分區的目的是將數據均勻的分布到預先定義的各個分區中,保證各分區的數據量大致一致.
MYSQL應用4.key分區
MYSQL應用key分區和hash分區相似,不同在于hash分區是用戶自定義函數進行分區,key分區使用mysql數據庫提供的函數進行分區,NDB cluster使用MD5函數來分區,對于其他存儲引擎mysql使用內部的hash函數,這些函數基于password()一樣的算法.
MYSQL應用5.columns分區
MYSQL應用上面的RANGE、LIST、HASH、KEY四種分區中,分區的條件必須是整形,如果不是整形需要通過函數將其轉換為整形.
MYSQL應用 mysql-5.5開始支持COLUMNS分區,可視為RANGE和LIST分區的進化,COLUMNS分區可以直接使用非整形數據進行分區.COLUMNS分區支持以下數據類型:
所有整形,如INT SMALLINT TINYINT BIGINT.FLOAT和DECIMAL則不支持.
日期類型,如DATE和DATETIME.其余日期類型不支持.
字符串類型,如CHAR、VARCHAR、BINARY和VARBINARY.BLOB和TEXT類型不支持.
COLUMNS可以使用多個列進行分區.
MYSQL應用新增分區
MYSQL應用??? ->?? ADD PARTITION (PARTITION p201010 VALUES LESS THAN (201011));
MYSQL應用Query OK, 0 rows affected (0.36 sec)
MYSQL應用Records: 0? Duplicates: 0? Warnings: 0
MYSQL應用mysql> ALTER TABLE sale_data DROP PARTITION p201010;
MYSQL應用Query OK, 0 rows affected (0.22 sec)
MYSQL應用Records: 0? Duplicates: 0? Warnings: 0
MYSQL應用分區的合并
MYSQL應用下面的SQL,將p201001 - p201009 合并為3個分區p2010Q1 - p2010Q3
MYSQL應用??? ->?? REORGANIZE PARTITION p201001,p201002,p201003,
MYSQL應用??? ->??????????????????????? p201004,p201005,p201006,
MYSQL應用??? ->??????????????????????? p201007,p201008,p201009 INTO
MYSQL應用??? -> (
MYSQL應用??? ->?? PARTITION p2010Q1 VALUES LESS THAN (201004),
MYSQL應用??? ->?? PARTITION p2010Q2 VALUES LESS THAN (201007),
MYSQL應用??? ->?? PARTITION p2010Q3 VALUES LESS THAN (201010)
MYSQL應用??? -> );
MYSQL應用Query OK, 0 rows affected (1.14 sec)
MYSQL應用Records: 0? Duplicates: 0? Warnings: 0
轉載請注明本頁網址:
http://www.snjht.com/jiaocheng/6408.html