【MySQL】MySQL分區表效率測試對比

這一段時間對數據庫優化方面的認識深有體會,就以MySQL爲例測試一下分區表的性能

MySQL5.0好像不支持分區,我用的5.5版本,測試是否支持可通過以下方法:

SHOW VARIABLES LIKE '%partition%';

如果結果爲yes則說明支持,如下圖:

這裏寫圖片描述


創建表

不分區的表:

CREATE TABLE no_part_tab
(id INT DEFAULT NULL,
remark VARCHAR(50) DEFAULT NULL,
d_date DATE DEFAULT NULL
)ENGINE=MYISAM

分區表:

CREATE TABLE part_tab
(id INT DEFAULT NULL,
remark VARCHAR(50) DEFAULT NULL,
d_date DATE DEFAULT NULL
)ENGINE=MYISAM
PARTITION BY RANGE(YEAR(d_date))(
PARTITION p0 VALUES LESS THAN(1995),
PARTITION p1 VALUES LESS THAN(1996),
PARTITION p2 VALUES LESS THAN(1997),
PARTITION p3 VALUES LESS THAN(1998),
PARTITION p4 VALUES LESS THAN(1999),
PARTITION p5 VALUES LESS THAN(2000),
PARTITION p6 VALUES LESS THAN(2001),
PARTITION p7 VALUES LESS THAN(2002),
PARTITION p8 VALUES LESS THAN(2003),
PARTITION p9 VALUES LESS THAN(2004),
PARTITION p10 VALUES LESS THAN maxvalue);

插入數據

MySQL沒有像oracle那樣的序列,所以要用循環插入,每張表插入800w數據做測試

插入未分區表:

DROP PROCEDURE IF EXISTS no_load_part;

DELIMITER//
CREATE PROCEDURE no_load_part()
BEGIN
    DECLARE i INT;
    SET i =1;
    WHILE i<8000001
    DO
    INSERT INTO no_part_tab VALUES(i,'no',ADDDATE('1995-01-01',(RAND(i)*36520) MOD 3652));
    SET i=i+1;
    END WHILE;
END//
DELIMITER ;

CALL no_load_part;

插入分區表:

DROP PROCEDURE IF EXISTS load_part;

DELIMITER&& 
CREATE PROCEDURE load_part()
BEGIN
    DECLARE i INT;
    SET i=1;
    WHILE i<8000001
    DO
    INSERT INTO part_tab VALUES(i,'partition',ADDDATE('1995-01-01',(RAND(i)*36520) MOD 3652));
    SET i=i+1;
    END WHILE;
END&&
DELIMITER ;

CALL load_part;

說明:首先刪除procedure,如果已存在的話,然後開始創建新的,delimiter是指定分隔符,默認的是“;”,這裏我們不能用分號,就指定爲“//”或者“&&”,創建時定義個int類型i,然後通過do…while循環,等程序執行完畢後把分隔符重新指定爲“;”,然後通過call語句寫入數據庫


測試效率

測試sql:

SELECT COUNT(*) FROM no_part_tab WHERE d_date > DATE '1995-01-01' AND d_date< DATE '1995-12-31';

SELECT COUNT(*) FROM part_tab WHERE d_date > DATE '1995-01-01' AND d_date< DATE '1995-12-31';

測試結果:

這裏寫圖片描述
這裏寫圖片描述

第一次查詢的結果對比。不分區是10.90秒,分區是0.28秒,可以看出分區效率提高了約97%,第一次查詢速度慢,當多查詢幾次效率一般會提高,我也試了試,下面是結果:

這裏寫圖片描述
這裏寫圖片描述

如圖可以看出,多查詢幾次後,不分區的表穩定在2.17秒左右,分區表一直在0.28秒左右,分區的效率依然相比提高約87%,分區效果相當顯著

測試數據庫相對簡單,當數據複雜並且外鍵多時時,MySQL處理近千萬的數據的表時效率是不太好的,這是分區就會顯得特別的重要


總結

測試過程中需要了解的注意點:

  • 創建表時採用的是myisam類型,除了myisam存儲引擎之外還有InnoDB、MEMORY、MERGE等,具體區別我不詳述了,我就簡單說一下,myisam性能相對來說好點,但不支持事務,另外是二進制,可以windows直接拷貝到linux,InnoDB支持事務等操作,其它存儲引擎下的情況我沒有測試,有興趣的可以試試
  • MySQL分區方法有多種,除去本次使用的range分區外還有list分區、hash分區、key分區和子分區,另外幾種分區方法有興趣的可以嘗試一下
發佈了44 篇原創文章 · 獲贊 17 · 訪問量 13萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章