Mysql表分區性能分析那些事兒

每個技術的研究需要進行性能測試,然後在進行分析是否滿足當前業務需要,以下爲Mysql表分區性能測試執行情況:

1、插入語句
INSERT INTO erp_bill_index_test SELECT * from erp_bill_index;
– 受影響的行: 4501076
– 時間: 877.984s

2、分區語句
– 刪除主鍵
alter table erp_bill_index_test drop primary key;
– 受影響的行: 4501076
– 時間: 724.435s

– 添加主鍵
alter table erp_bill_index_test add primary key(billid,billdate);
– 時間: 1281.912s

– 創建分區

ALTER TABLE erp_bill_index_test PARTITION by RANGE(to_days(billdate))
(
  PARTITION p201801 VALUES LESS THAN (to_days('2018-02-01')),
  PARTITION p201802 VALUES LESS THAN (to_days('2018-03-01')),
  PARTITION p201803 VALUES LESS THAN (to_days('2018-04-01')),
  PARTITION p201804 VALUES LESS THAN (to_days('2018-05-01')),
  PARTITION p201805 VALUES LESS THAN (to_days('2018-06-01')),
  PARTITION p201806 VALUES LESS THAN (to_days('2018-07-01')),
  PARTITION p201807 VALUES LESS THAN (to_days('2018-08-01')),
  PARTITION p201808 VALUES LESS THAN (to_days('2018-09-01')),
  PARTITION p201809 VALUES LESS THAN (to_days('2018-10-01')),
  PARTITION p201810 VALUES LESS THAN (to_days('2018-11-01')),
  PARTITION p201811 VALUES LESS THAN (to_days('2018-12-01')),
  PARTITION p201812 VALUES LESS THAN (to_days('2019-01-01')),
  PARTITION p201901 VALUES LESS THAN (to_days('2019-02-01')),
  PARTITION p201902 VALUES LESS THAN (to_days('2019-03-01')),
  PARTITION p201903 VALUES LESS THAN (to_days('2019-04-01')),
  PARTITION p201904 VALUES LESS THAN  MAXVALUE
);

受影響的行: 4501076
時間: 561.828s

3、測試語句
– 分區前(原始數據)

EXPLAIN 
SELECT COUNT(*) from erp_bill_index where  billdate>'2019-01-01' and billdate<'2019-02-01' LIMIT 0,20; -- 29.36s,0.99s
EXPLAIN 
SELECT COUNT(*) from erp_bill_index where  billdate>'2019-01-01' and billdate<'2019-02-01' ORDER BY billdate DESC LIMIT 0,20; -- 0.11s
EXPLAIN 
SELECT COUNT(*) from erp_bill_index where  billdate>'2019-01-01' and billdate<'2019-02-01' GROUP BY cityid ORDER BY billdate DESC LIMIT 0,20; -- 255.12s,250.46s
EXPLAIN 
SELECT COUNT(*) from erp_bill_index where  billdate>'2019-01-01' and billdate<'2019-02-01' and creatorfullname LIKE '%建梅%' GROUP BY cityid ORDER BY billdate DESC LIMIT 0,20; -- 250.95s
EXPLAIN 
SELECT COUNT(*) from erp_bill_index a
LEFT JOIN erp_bill_index_ext ext on a.profileid=ext.profileid and a.billid=ext.billid
WHERE  a.billdate>'2019-01-01' and a.billdate<'2019-02-01' LIMIT 0,20; -- 6.49s,1.36s
-- 沒使用分區字段
EXPLAIN 
SELECT COUNT(*) from erp_bill_index where billid>3976858 and billid<4976858; -- 0.09s,0.04s
SELECT COUNT(*) from erp_bill_index where billid>4976858 and billid<8976858; -- 2.50s,0.10s
SELECT COUNT(*) from erp_bill_index where billid>8976858 and billid<16976858; -- 8.59s,0.18s

– 分區前(相同主鍵)

EXPLAIN 
SELECT COUNT(*) from erp_bill_index_test_diff  where  billdate>'2019-01-01' and billdate<'2019-02-01' LIMIT 0,20; -- 9.62s,0.93s
EXPLAIN 
SELECT COUNT(*) from erp_bill_index_test_diff  where  billdate>'2019-01-01' and billdate<'2019-02-01' ORDER BY billdate DESC LIMIT 0,20; -- 0.99s
EXPLAIN 
SELECT COUNT(*) from erp_bill_index_test_diff  where  billdate>'2019-01-01' and billdate<'2019-02-01' GROUP BY cityid ORDER BY billdate DESC LIMIT 0,20; -- 186.02s,189.73s
EXPLAIN 
SELECT COUNT(*) from erp_bill_index_test_diff  where  billdate>'2019-01-01' and billdate<'2019-02-01' and creatorfullname LIKE '%建梅%' GROUP BY cityid ORDER BY billdate DESC LIMIT 0,20; -- 188.04s
EXPLAIN 
SELECT COUNT(*) from erp_bill_index_test_diff  a
LEFT JOIN erp_bill_index_ext ext on a.profileid=ext.profileid and a.billid=ext.billid
WHERE  a.billdate>'2019-01-01' and a.billdate<'2019-02-01' LIMIT 0,20; -- 12.85s,1.34s
-- 沒使用分區字段
SELECT MAX(billid),MIN(billid) FROM erp_bill_index;-- 3976858 97865998
EXPLAIN 
SELECT COUNT(*) from erp_bill_index_test_diff  where billid>3976858 and billid<4976858; -- 0.21s,0.04s
SELECT COUNT(*) from erp_bill_index_test_diff  where billid>4976858 and billid<8976858; -- 5.26s,0.11s
SELECT COUNT(*) from erp_bill_index_test_diff  where billid>8976858 and billid<26976858;-- 28.87s,0.47s

– 分區後

EXPLAIN 
SELECT COUNT(*) from erp_bill_index_test where  billdate>'2019-01-01' and billdate<'2019-02-01' LIMIT 0,20; -- 4.15s,0.47s
EXPLAIN 
SELECT COUNT(*) from erp_bill_index_test where  billdate>'2019-01-01' and billdate<'2019-02-01' ORDER BY billdate DESC LIMIT 0,20; -- 0.46s
EXPLAIN 
SELECT COUNT(*) from erp_bill_index_test where  billdate>'2019-01-01' and billdate<'2019-02-01' GROUP BY cityid ORDER BY billdate DESC LIMIT 0,20; -- 71.44s,71.79s
EXPLAIN 
SELECT COUNT(*) from erp_bill_index_test where  billdate>'2019-01-01' and billdate<'2019-02-01' and creatorfullname LIKE '%建梅%' GROUP BY cityid ORDER BY billdate DESC LIMIT 0,20; -- 69.93s
EXPLAIN 
SELECT COUNT(*) from erp_bill_index_test a
LEFT JOIN erp_bill_index_ext ext on a.profileid=ext.profileid and a.billid=ext.billid
WHERE  a.billdate>'2019-01-01' and a.billdate<'2019-02-01' LIMIT 0,20; -- 5.21s,0.81s
-- 沒使用分區字段
EXPLAIN 
SELECT COUNT(*) from erp_bill_index_test where billid>3976858 and billid<4976858; -- 0.39s,0.04s
SELECT COUNT(*) from erp_bill_index_test where billid>4976858 and billid<8976858; -- 4.92s,0.10s
SELECT COUNT(*) from erp_bill_index_test where billid>8976858 and billid<16976858; -- 10.78s,0.19s

總結

隨着服務器的配置提升將會增加數據庫的性能,分區能夠解決部分單表的查詢性能優化,數據量一旦達到一定量級和業務比較複雜進行分組和排序,表分區不能達到質的飛躍,只是有部分提升;如果需要用到表分區,需要結合自身的業務複雜度進行綜合評定

以上是結合本人當前業務需要做出的分析,如有不理解之處,還望積極留言,相互探討學習!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章