一、概述
當(dāng) MySQL的總記錄數(shù)超過了100萬后,會(huì)出現(xiàn)性能的大幅度下降嗎?答案是肯定的,但是,性能下降>的比率不一而同,要看系統(tǒng)的架構(gòu)、應(yīng)用程序、還有>包括索引、服務(wù)器硬件等多種因素而定。當(dāng)有網(wǎng)友問我這個(gè)問題的時(shí)候,我最常見的回答>就是:分表,可以根據(jù)id區(qū)間或者時(shí)間先后順序等多種規(guī)則來分表。分表很容易,然而由此所帶來的應(yīng)用程序甚至是架構(gòu)方面的改動(dòng)工作卻不>容小覷,還包括將來的擴(kuò)展性等。
在以前,一種解決方案就是使用 MERGE
類型,這是一個(gè)非常方便的做飯。架構(gòu)和程序基本上不用做改動(dòng),不過,它的缺點(diǎn)是顯見的:
1.只能在相同結(jié)構(gòu)的 MyISAM 表上使用
2.無法享受到 MyISAM 的全部功能,例如無法在 MERGE 類型上執(zhí)行 FULLTEXT 搜索
3.它需要使用更多的文件描述符
4.讀取索引更慢
這個(gè)時(shí)候,MySQL 5.1 中新增的分區(qū)(Partition)功能的優(yōu)勢(shì)也就很明顯了:
1.與單個(gè)磁盤或文件系統(tǒng)分區(qū)相比,可以存儲(chǔ)更多的數(shù)據(jù)
2.很容易就能刪除不用或者過時(shí)的數(shù)據(jù)
3.一些查詢可以得到極大的優(yōu)化
4.涉及到 SUM()/COUNT() 等聚合函數(shù)時(shí),可以并行進(jìn)行
5.IO吞吐量更大
分區(qū)允許可以設(shè)置為任意大小的規(guī)則,跨文件系統(tǒng)分配單個(gè)表的多個(gè)部分。實(shí)際上,表的不同部分在不同的位置被存儲(chǔ)為單獨(dú)的表。
分區(qū)應(yīng)該注意的事項(xiàng):
1、 做分區(qū)時(shí),要么不定義主鍵,要么把分區(qū)字段加入到主鍵中。
2、 分區(qū)字段不能為NULL,要不然怎么確定分區(qū)范圍呢,所以盡量NOT NULL
二、分區(qū)的類型
1.RANGE 分區(qū):基于屬于一個(gè)給定連續(xù)區(qū)間的列值,把多行分配給分區(qū)。
2.LIST 分區(qū):類似于按RANGE分區(qū),區(qū)別在于LIST分區(qū)是基于列值匹配一個(gè)離散值集合中的某個(gè)值來進(jìn)行選擇。
2.HASH分區(qū):基于用戶定義的表達(dá)式的返回值來進(jìn)行選擇的分區(qū),該表達(dá)式使用將要插入到表中的這些行的列值進(jìn)行計(jì)算。這個(gè)函數(shù)可以包>含MySQL中有效的、產(chǎn)生非負(fù)整數(shù)值的任何表達(dá)式。
3.KEY分區(qū):類似于按HASH分區(qū),區(qū)別在于KEY分區(qū)只支持計(jì)算一列或多列,且MySQL服務(wù)器提供其自身的哈希函數(shù)。必須有一列或多列包含>整數(shù)值。
可以通過使用SHOW VARIABLES命令來確定MySQL是否支持分區(qū),例如:
代碼如下:
mysql> SHOW VARIABLES LIKE '%partition%';
+-----------------------+-------+
| Variable_name | Value |
+-----------------------+-------+
| have_partition_engine | YES |
+-----------------------+-------+
1
代碼如下:
mysql> SHOW VARIABLES LIKE '%partition%';
+-----------------------+-------+
| Variable_name | Value |
+-----------------------+-------+
| have_partition_engine | YES |
+-----------------------+-------+
1 row in set (0.00 sec)
1、range分區(qū)
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注