成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

MySQL數據庫分區的概念與2大好處

數據庫 MySQL
以下的文章主要描述的是MySQL數據庫分區的實際操作步驟以及在其實際操作中的2大好處的具體體現,下面就是文章的主要內容描述。

我們大家都知道通過MySQL數據庫分區(Partition)可以提升MySQL數據庫的性能,那么到底什么是MySQL數據庫分區呢?以及其實際應用的好處的表現有哪些呢?以下的文章就是對這些內容的描述。

什么是數據庫分區?

數據庫分區是一種物理數據庫設計技術,DBA和數據庫建模人員對其相當熟悉。雖然分區技術可以實現很多效果,但其主要目的是為了在特定的SQL操作中減少數據讀寫的總量以縮減響應時間。 分區主要有兩種形式://這里一定要注意行和列的概念(row是行,column是列)

水平分區(Horizontal Partitioning) 這種形式分區是對表的行進行分區,通過這樣的方式不同分組里面的物理列分割的數據集得以組合,從而進行個體分割(單分區)或集體分割(1個或多個分區)。所有在表中定義的列在每個數據集中都能找到,所以表的特性依然得以保持。

 

舉個簡單例子:一個包含十年發票記錄的表可以被MySQL數據庫分區為十個不同的分區,每個分區包含的是其中一年的記錄。(朋奕注:這里具體使用的分區方式我們后面再說,可以先說一點,一定要通過某個屬性列來分割,譬如這里使用的列就是年份)

 

垂直分區(Vertical Partitioning) 這種分區方式一般來說是通過對表的垂直劃分來減少目標表的寬度,使某些特定的列被劃分到特定的分區,每個分區都包含了其中的列所對應的行。

 

舉個簡單例子:一個包含了大text和BLOB列的表,這些text和BLOB列又不經常被訪問,這時候就要把這些不經常使用的text和BLOB了劃分到另一個分區,在保證它們數據相關性的同時還能提高訪問速度。

 

在數據庫供應商開始在他們的數據庫引擎中建立分區(主要是水平分區)時,DBA和建模者必須設計好表的物理分區結構,不要保存冗余的數據(不同表中同時都包含父表中的數據)或相互聯結成一個邏輯父對象(通常是視圖)。這種做法會使水平分區的大部分功能失效,有時候也會對垂直分區產生影響。

 

 

在MySQL 5.1中進行分區

 

MySQL5.1中最激動人心的新特性應該就是對水平MySQL數據庫分區的支持了。這對MySQL的使用者來說確實是個好消息,而且她已經支持分區大部分模式:

Range(范圍) – 這種模式允許DBA將數據劃分不同范圍。例如DBA可以將一個表通過年份劃分成三個分區,80年代(1980's)的數據,90年代(1990's)的數據以及任何在2000年(包括2000年)后的數據。

 

Hash(哈希) – 這中模式允許DBA通過對表的一個或多個列的Hash Key進行計算,***通過這個Hash碼不同數值對應的數據區域進行分區,。例如DBA可以建立一個對表主鍵進行分區的表。

 

Key(鍵值) – 上面Hash模式的一種延伸,這里的Hash Key是MySQL系統產生的。

 

List(預定義列表) – 這種模式允許系統通過DBA定義的列表的值所對應的行數據進行分割。例如:DBA建立了一個橫跨三個分區的表,分別根據2004年2005年和2006年值所對應的數據。

 

Composite(復合模式) - 很神秘吧,哈哈,其實是以上模式的組合使用而已,就不解釋了。舉例:在初始化已經進行了Range范圍分區的表上,我們可以對其中一個分區再進行hash哈希分區。#p#

 

分區帶來的兩點好處:

性能的提升(Increased performance) - 在掃描操作中,如果MySQL的優化器知道哪個分區中才包含特定查詢中需要的數據,它就能直接去掃描那些分區的數據,而不用浪費很多時間掃描不需要的地方了。需要舉個例子?好啊,百萬行的表劃分為10個分區,每個分區就包含十萬行數據,那么查詢分區需要的時間僅僅是全表掃描的十分之一了,很明顯的對比。

同時對十萬行的表建立索引的速度也會比百萬行的快得多得多。如果你能把這些分區建立在不同的磁盤上,這時候的I/O讀寫速度就“不堪設想”(沒用錯詞,真的太快了,理論上100倍的速度提升啊,這是多么快的響應速度啊,所以有點不堪設想了)了。

對數據管理的簡化(Simplified data management) - 分區技術可以讓DBA對數據的管理能力提升。通過優良的MySQL數據庫分區,DBA可以簡化特定數據操作的執行方式。例如:DBA在對某些分區的內容進行刪除的同時能保證余下的分區的數據完整性(這是跟對表的數據刪除這種大動作做比較的)。 此外分區是由MySQL系統直接管理的,DBA不需要手工的去劃分和維護。例如:這個例如沒意思,不講了,如果你是DBA,只要你劃分了分區,以后你就不用管了就是了。

站在性能設計的觀點上,俺們對以上的內容也是相當感興趣滴。通過使用分區和對不同的SQL操作的匹配設計,數據庫的性能一定能獲得巨大提升。下面咱們一起用用這個MySQL 5.1的新功能看看。

下面所有的測試都在Dell Optiplex box with a Pentium 4 3.00GHz processor, 1GB of RAM機器上(炫耀啊……),Fedora Core 4和MySQL 5.1.6 alpha上運行通過。

 

如何進行實際分區 看看分區的實際效果吧。我們建立幾個同樣的MyISAM引擎的表,包含日期敏感的數據,但只對其中一個分區。分區的表(表名為part_tab)我們采用Range范圍分區模式,通過年份進行MySQL數據庫分區:

  1. mysql> CREATE TABLE part_tab   
  2. -> ( c1 int default NULL,   
  3. -> c2 varchar(30) default NULL,   
  4. -> c3 date default NULL ->   
  5. -> ) engine=myisam   
  6. -> PARTITION BY RANGE (year(c3))   
  7. (PARTITION p0 VALUES LESS THAN (1995),   
  8. -> PARTITION p1 VALUES LESS THAN (1996) , PARTITION p2 VALUES LESS THAN (1997) ,   
  9. -> PARTITION p3 VALUES LESS THAN (1998) , PARTITION p4 VALUES LESS THAN (1999) ,   
  10. -> PARTITION p5 VALUES LESS THAN (2000) , PARTITION p6 VALUES LESS THAN (2001) ,   
  11. -> PARTITION p7 VALUES LESS THAN (2002) , PARTITION p8 VALUES LESS THAN (2003) ,   
  12. -> PARTITION p9 VALUES LESS THAN (2004) , PARTITION p10 VALUES LESS THAN (2010),   
  13. -> PARTITION p11 VALUES LESS THAN MAXVALUE );   
  14. Query OK, 0 rows affected (0.00 sec) 

 

注意到了這里的***一行嗎?這里把不屬于前面年度劃分的年份范圍都包含了,這樣才能保證數據不會出錯,大家以后要記住啊,不然數據庫無緣無故出錯你就爽了。

 

那下面我們建立沒有MySQL數據庫分區的表(表名為no_part_tab):

 

  1. mysql> create table no_part_tab   
  2. -> (c1 int(11) default NULL,   
  3. -> c2 varchar(30) default NULL,   
  4. -> c3 date default NULL)   
  5. engine=myisam;   
  6. Query OK, 0 rows affected (0.02 sec)  

下面咱寫一個存儲過程它能向咱剛才建立的已分區的表中平均的向每個分區插入共8百萬條不同的數據。填滿后,咱就給沒分區的克隆表中插入相同的數據:

  1. mysql> delimiter //   
  2. mysql> CREATE PROCEDURE load_part_tab()   
  3. -> begin   
  4. -> declare v int default 0;   
  5. -> while v < 8000000   
  6. -> do   
  7. -> insert into part_tab   
  8. -> values (v,'testing partitions',adddate('1995-01-01',(rand(v)*36520) mod 3652));   
  9. -> set vv = v + 1;   
  10. -> end while;   
  11. -> end   
  12. -> //   
  13. Query OK, 0 rows affected (0.00 sec)   
  14. mysql> delimiter ;   
  15. mysql> call load_part_tab();   
  16. Query OK, 1 row affected (8 min 17.75 sec)   
  17. mysql> insert into no_part_tab select * from part_tab;   
  18. Query OK, 8000000 rows affected (51.59 sec) Records: 8000000 Duplicates: 0 Warnings: 0   

表都準備好了。咱開始對這兩表中的數據進行簡單的范圍查詢吧。先分區了的,后沒MySQL數據庫分區的,跟著有執行過程解析(MySQL Explain命令解析器),可以看到MySQL做了什么:

  1. mysql> select count(*) from no_part_tab where   
  2. -> c3 > date '1995-01-01' and c3 < date '1995-12-31';   
  3. +----------+ | count(*) | +----------+ | 795181 | +----------+ 1 row in set (38.30 sec)   
  4. mysql> select count(*) from part_tab where   
  5. -> c3 > date '1995-01-01' and c3 < date '1995-12-31';  
  6. +----------+ | count(*) | +----------+ | 795181 | +----------+ 1 row in set (3.88 sec)   
  7. mysql> explain select count(*) from no_part_tab where   
  8. -> c3 > date '1995-01-01' and c3 < date '1995-12-31'\G   
  9. id: 1 select_type:   
  10. SIMPLE table: no_part_tab   
  11. type: ALL   
  12. possible_keys: NULL   
  13. key: NULL   
  14. key_len: NULL   
  15. ref: NULL   
  16. rows: 8000000   
  17. Extra: Using where 1 row in set (0.00 sec)   
  18. mysql> explain partitions select count(*) from part_tab where   
  19. -> c3 > date '1995-01-01' and c3 < date '1995-12-31'\G   
  20. id: 1   
  21. select_type: SIMPLE   
  22. table: part_tab   
  23. partitions: p1   
  24. type: ALL   
  25. possible_keys: NULL   
  26. key: NULL   
  27. key_len: NULL   
  28. ref: NULL   
  29. rows: 798458   
  30. Extra: Using where 1 row in set (0.00 sec)   

從上面結果可以容易看出,設計恰當表分區能比非分區的減少90%的響應時間。而命令解析Explain程序也告訴我們在對已分區的表的查詢過程中僅對***個分區進行了掃描,其他都跳過了。

嗶厲吧拉,說阿說……反正就是這個分區功能對DBA很有用拉,特別對VLDB和需要快速反應的系統。

 

對Vertical Partitioning的一些看法 雖然MySQL 5.1自動實現了水平分區,但在設計數據庫的時候不要輕視垂直MySQL數據庫分區。雖然要手工去實現垂直分區,但在特定場合下你會收益不少的。例如在前面建立的表中,VARCHAR字段是你平常很少引用的,那么對它進行垂直分區會不會提升速度呢?咱們看看測試結果:

  1. mysql> desc part_tab; +-------+-------------+------+-----+---------+-------+   
  2. | Field | Type | Null | Key | Default | Extra | +-------+-------------+------+-----+---------+-------+   
  3. | c1 | int(11) | YES | | NULL | |  
  4. | c2 | varchar(30) | YES | | NULL | |  
  5. | c3 | date | YES | | NULL | | +-------+-------------+------+-----+---------+-------+ 3 rows in set (0.03 sec)   
  6. mysql> alter table part_tab drop column c2;   
  7. Query OK, 8000000 rows affected (42.20 sec) Records: 8000000 Duplicates: 0 Warnings: 0   
  8. mysql> desc part_tab; +-------+---------+------+-----+---------+-------+   
  9. | Field | Type | Null | Key | Default | Extra | +-------+---------+------+-----+---------+-------+   
  10. | c1 | int(11) | YES | | NULL | |   
  11. | c3 | date | YES | | NULL | | +-------+---------+------+-----+---------+-------+  
  12. 2 rows in set (0.00 sec)   
  13. mysql> select count(*) from part_tab where   
  14. -> c3 > date '1995-01-01' and c3 < date '1995-12-31'; +----------+   
  15. | count(*) | +----------+   
  16. | 795181 | +----------+   
  17. 1 row in set (0.34 sec)   

在設計上去掉了VARCHAR字段后,不止是你,俺也發現查詢響應速度上獲得了另一個90%的時間節省。所以大家在設計表的時候,一定要考慮,表中的字段是否真正關聯,又是否在你的查詢中有用?

補充說明

 

這么簡單的文章肯定不能說全MySQL 5.1 分區機制的所有好處和要點(雖然對自己寫文章水平很有信心),下面就說幾個感興趣的:

支持所有存儲引擎(MyISAM, Archive, InnoDB, 等等)

 

對分區的表支持索引,包括本地索引local indexes,對其進行的是一對一的視圖鏡像,假設一個表有十個分區,那么其本地索引也包含十個分區。

 

關于分區的元數據Metadata的表可以在INFORMATION_SCHEMA數據庫中找到,表名為PARTITIONS。

 

All SHOW 命令支持返回MySQL數據庫分區表以及元數據的索引。

 

對其操作的命令和實現的維護功能有(比對全表的操作還多):

 

  1. ADD PARTITION   
  2. DROP PARTITION   
  3. COALESCE PARTITION   
  4. REORGANIZE PARTITION   
  5. ANALYZE PARTITION   
  6. CHECK PARTITION   
  7. OPTIMIZE PARTITION   
  8. REBUILD PARTITION   
  9. REPAIR PARTITION  

 

 以上的相關內容就是對MySQL數據庫分區的介紹,望你能有所收獲。

【編輯推薦】

  1. 使用mysqldump備份數據庫的具體步驟
  2. CentOS系統找回mysql登錄密碼
  3. CentOS系統5編譯安裝mysql-4.1.22
  4. CentOS系統安裝MySQL支持遠程連接的方法
  5. Ubuntu mysql可以把data防止到內存盤中
責任編輯:佚名 來源: cnblogs
相關推薦

2010-08-13 15:42:22

DB2數據庫分區

2011-08-17 13:55:25

VoIPPBX

2023-06-07 16:21:16

2019-06-03 11:13:17

商業物聯網物聯網IOT

2016-11-21 17:36:24

AR出版

2019-10-09 14:21:25

物聯網智能停車傳感器

2023-09-01 10:31:02

云計算云挑戰

2010-08-20 13:17:50

DB2數據庫分區管理

2021-04-10 15:34:09

LinuxLinux好處

2018-05-14 16:14:56

數據庫MySQL分表與分區

2020-08-12 11:29:16

大數據大數據應用數據

2011-08-23 13:43:48

2010-08-17 09:49:18

Div Css

2020-05-17 15:40:11

智能停車商業模式IOT

2010-08-03 14:40:05

DB2數據庫

2016-11-18 17:14:56

Citrix NetS

2021-07-26 05:38:53

IaC基礎設施即代碼開發

2019-12-31 21:20:56

ERP物聯網集成

2018-06-21 06:42:07

云計算云端數據中心

2021-01-13 10:17:13

網絡安全演練網絡安全
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 成人午夜在线观看 | 91久操视频| 欧美日韩专区 | 91久久精品一区二区二区 | 91精品国产91久久久久久最新 | 一色桃子av一区二区 | 日韩中文字幕在线视频 | 亚洲精品高清视频在线观看 | 欧美一区二区三区在线观看视频 | 美国十次成人欧美色导视频 | 国产视频精品在线观看 | 国产精品一区二区久久 | 国产精品美女一区二区 | 欧美日产国产成人免费图片 | 欧美日本韩国一区二区 | 亚州综合一区 | 日日夜夜影院 | 97超碰站| 国产精品视频一区二区三区不卡 | 二区亚洲 | 午夜伦理影院 | 成人激情视频在线播放 | 久久久久久免费毛片精品 | 亚洲一二三区免费 | 国产精品大片在线观看 | 97狠狠干| 大陆一级毛片免费视频观看 | 中文字幕av高清 | 伊人热久久| 国产成人一区二区三区久久久 | 一级欧美 | 日韩久久久久久久久久久 | 欧美成人自拍视频 | 久久久久久亚洲精品 | 国产一区二区久久 | 国产精品成人一区二区 | 国产精品成人一区二区三区吃奶 | 精品9999| 中日韩av | 亚洲视频一区二区三区 | 一级黄色片网站 |