Mysql大数据中表分区的应用
一、支持Mysql表分區(qū)需要MYSQL版本為5.1以上,含5.1~
二、表分區(qū)的作用:增加MYSQL的執(zhí)行效率,可以在以下幾點分析表分區(qū)是如何增加MYSQL的執(zhí)行效率的。
1、與單個磁盤或文件系統(tǒng)分區(qū)相比,可以存儲更多的數(shù)據(jù)。
2、對于那些已經(jīng)失去保存意義的數(shù)據(jù),通常可以通過刪除與那些數(shù)據(jù)有關(guān)的分區(qū),很容易地刪除那些數(shù)據(jù)。
3、一些查詢可以得到極大的優(yōu)化,這主要是借助于滿足一個給定WHERE語句的數(shù)據(jù)可以只保存在一個或多個分區(qū)內(nèi),這樣在查找時就不用查找其他剩余的分區(qū)。
4、涉及到例如SUM()和COUNT()這樣聚合函數(shù)的查詢,可以很容易地進行并行處理。這種查詢的一個簡單例子如 “SELECT salesperson_id, COUNT (orders) as order_total FROM sales GROUP BY salesperson_id;”。通過“并行”,這意味著該查詢可以在每個分區(qū)上同時進行,最終結(jié)果只需通過總計所有分區(qū)得到的結(jié)果。
5、通過跨多個磁盤來分散數(shù)據(jù)查詢,來獲得更大的查詢吞吐量。
三、通俗的講表分區(qū)是將一個大表,根據(jù)條件分割成若干個小表
四、表分區(qū)有哪些類型:
RANGE分區(qū):基于屬于一個給定連續(xù)區(qū)間的列值,把多行分配給分區(qū)。
LIST分區(qū):類似于按RANGE分區(qū),區(qū)別在于LIST分區(qū)是基于列值匹配一個離散值集合中的某個值來進行選擇。
HASH分區(qū):基于用戶定義的表達式的返回值來進行選擇的分區(qū),該表達式使用將要插入到表中的這些行的列值進行計算。這個函數(shù)可以包含MySQL 中有效的、產(chǎn)生非負整數(shù)值的任何表達式。
KEY分區(qū):類似于按HASH分區(qū),區(qū)別在于KEY分區(qū)只支持計算一列或多列,且MySQL 服務器提供其自身的哈希函數(shù)。必須有一列或多列包含整數(shù)值。
五、細分類型
RANGE分區(qū)
<1>創(chuàng)建含分區(qū)表
CREATE TABLE part_tab( c1 int default NULL, c2 varchar(30) default NULL, c3 date default NULL) engine=myisam PARTITION BY RANGE (year(c3)) (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 (2010), PARTITION p11 VALUES LESS THAN MAXVALUE);<1>創(chuàng)建不含分區(qū)表
CREATE TABLE no_part_tab( c1 int default NULL, c2 varchar(30) default NULL, c3 date default NULL) engine=myisam<3>創(chuàng)建存儲過程,在表中插入800,0000條數(shù)據(jù)以做測試
CREATE PROCEDURE load_part_tab() begin declare v int default 0; while v < 8000000 do insert into part_tab values (v,'testing partitions',adddate('1995-01-01',(rand(v)*36520) mod 3652)); set v = v + 1; end while; end<4>再寫入未分區(qū)表中
insert into no_part_tab select * from part_tab;<5>好了,所有表數(shù)據(jù)準備完畢,下面我們來做一下測試
執(zhí)行命令: select count(*) from no_part_tab where c3 >date('1995-01-01') and c3 < date('1995-12-31');執(zhí)行結(jié)果:[SQL] select count(*) from no_part_tab where c3 >date('1995-01-01') and c3 <date('1995-12-31'); 受影響的行: 0 時間: 2.594ms 執(zhí)行命令: select count(*) from part_tab where c3 >date('1995-01-01') and c3 < date('1995-12-31'); 執(zhí)行結(jié)果:[SQL] select count(*) from part_tab where c3 > date('1995-01-01') and c3 <date('1995-12-31'); 受影響的行: 0 時間: 0.297ms很清楚的看到了,讀取同樣的數(shù)據(jù),分區(qū)與未分區(qū)的兩個表相差的不是同一個級別的數(shù)據(jù)~,接下來就可以修改自己大數(shù)據(jù)的表了
ALTER TABLE sale_data REORGANIZE PARTITION p2010Q1 INTO ( PARTITION s2009 VALUES LESS THAN (201001), PARTITION s2010 VALUES LESS THAN (201004) );總結(jié)
以上是生活随笔為你收集整理的Mysql大数据中表分区的应用的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 解决Apache 服务器不支持FLV视频
- 下一篇: Mysql5.7 ZIP 压缩包非安装版