mysql分區管理-range分區

為瞭更好的演示range分區,首先對mysql server的啟動和關閉進行說明:

 

一,如何啟動mysqld?

 

        本人把mysql安裝在windows環境下,安裝的主目錄homedir是"c:\Program Files
\MySQL\MySQL Server 5.1\",啟動方法非常簡單:首先進入cmd命令行窗口,如下圖:

 

        

         執行如下命令:cd  c:\Program Files\MySQL\MySQL Server 5.1\,進入mysql安裝目錄,
可以看到bin目錄,該目錄是存放mysql的各種可執行文件,cd bin,進入該目錄,

 

找到mysqld.exe的可執行文件,執行mysqld,即啟動mysqld,如下圖:

  www.aiwalls.com  

       
 此時,打開任務管理器 – 》進程,可以看到mysqld.exe,表示啟動成功。

 

         

 

二,如何關閉mysqld?

 

        運行cmd,將路徑切換到:c:\Program Files\MySQL\MySQL Server 5.1\bin下,用命令 

        mysqladmin -u root -p shutdown

 

        如下圖所示:

 

      

 

三,innodb_file_per_table設置

 

        mysql innodb 存儲引擎對表空間的管理在默認情況下是使用共享表空間,
即所有表的索引和數據均放在一個以ibdata1的文件中,我們可以執行下面的命令查看:

 

      

        可以看到對應的Value: OFF,下面我們在配置文件my.ini增加下面一行:

 

        #tenfy: 新添加的參數

        innodb_file_per_table=1

  www.aiwalls.com  

        然後,重新啟動mysqld,此時,可以看到:

 

  

         那麼,你也許會問,之前在innodb_file_per_table=0的時候已經創建的表,
此時還是繼續使用共享表空間嗎?是的,如果我們不對表進行修改,之前的可以繼續使用,但

 

         將共享表空間修改成獨立表空間,除瞭修改innodb_file_per_table參數外,
我們需要修改所有innodb的表都運行如下:

 

         alter table table_name engine=innodb; (tenfy:註意紅色部分必須添加,
否則無法生效),一旦執行完成後,我們可以在data的mytest1目錄下,看到根據各個分區
生成的各個.ibd後綴的文件,這些文件就是獨立表空間文件,每個分區對應一個。
(關於分區我們將在下面講解)
 

 

四,mysql分區概述

 

       分區功能並不是在存儲引擎層完成的,因此除瞭innodb支持分區外,MyISAM,NDB
等均支持分區功能,而CSV,FEDERATED,MERGE則不支持分區功能。而MySQL在5.1版本時
添加瞭對分區功能的支持。

 

      分區是將一個表或者索引物分解成多個更小的,更可管理的部分,而對用戶訪問db的應用來說,
從邏輯上看,隻有一個表或者一個索引(這裡跟分庫分表的訪問不一樣),但在物理上這個表或者
索引可能是由許多個物理分區組成的,每個分區都是一個獨立的對象,可以進行獨立處理。

  www.aiwalls.com  

      那麼怎麼判斷當前數據庫是否啟用瞭分區功能呢?可以執行如下命令進行查看:

 

 

      或者:

      

 

       當前MySQL支持以下幾種分區:

 

       1,RANGE分區:顧名思義,區間分區,行數據基於一個給定連續區間的列值放入分區。

 

       2,LIST分區:列表分區,與RANGE分區類似,隻是LIST分區面向的是離散可列舉的值。

 

       3,HASH分區:根據用戶自定義的表達式的返回值來進行分區,返回值不能是負數。

 

       4,KEY分區:根據MySQL數據庫提供的哈希函數進行分區。

 

       但是不論什麼類型的分區,必須註意以下兩個問題:

 

      1,如果表中存在primary key 或者unique key時,分區的列必須是primary key或者
unique key的一個組成部分,也就是說,分區函數的列隻能從pk或者uk這些key中取子集。  www.aiwalls.com  

 

       如下:

      

 

      表par_tb1有唯一key,他們對應的列是col1,col2。而此時進行分區的列卻是col3,
因此出現1503錯誤,此時我們把col3加入到unique key或者用col1或者col2進行分區均

 

      沒問題:

      

      2,如果表中不存在任何的primary key或者unique key,則可以指定任何一個列作為分區列。

 

五,RANGE分區。

 

        RANGE分區是最常用的一種分區類型,它的特點主要是按照某個列連續的值進行分區,
因此在分區中常常使用values less than (xxx),下面我們以具體的例子來說明。

 

        首先我們創建一個表,名字叫:range_par_tbl,有一個int類型的id字段,當id小於10的
時候,插入第一個分區,當id小於20的時候插入第二分區。如下:

        

        此時,我們查看對應的分區表空間文件(註意:因為我們之前設置瞭innodb_file_per_table=1),
此時啟用分區後,表已經由建立分區時的各個分區ibd文件組成瞭,由於我們分瞭兩個區,
因此可以看到對應的兩個文件:  www.aiwalls.com  
 

        

 

        可以看到,分區對應的表空間文件命名規則為:表名#p#分區名.ibd

 

        接下來我們插入一些數據到對應的表裡面,看看對應的記錄是否真的按照id進行分區:

        

        可以看到,我們已經成功插入瞭id分別是9,10,15的三條記錄,接下來我們來驗證一下,
對應的記錄是真的存儲在對應的分區裡面。

 

        這裡我們可以通過查詢information_schema.PARTITIONS表來查看每個分區的具體信息:

        

        說明一下:database() 函數獲取當前use 的database,即mytest1 database,
關註用紅色方框標識部分的內容,可以看到分區p0的table_rows:1,p1的table_rows:2,
這就是我們之前插入的記錄:9,10,15,其中9 小於10,所以放到第一個分區p0,10和15均是
大於等於10且小於20,所以,這兩條記錄放到分區p1。  www.aiwalls.com  

 

       大傢也許會問,如果我插入一條記錄對應的id 大於20呢?因為沒有找到對應的分區,
mysql會如何處理?我們繼續看下面的代碼:

 

       

       可以看到,此時mysql提示1526的錯誤,此時,我們可以增加一個maxvalue的分區,
並且插入之前異常的記錄,如下:

               

       range分區常常用於按照日期列的分區,這樣非常方便我們進行按照時間或者年份的
維度進行分區管理,這在訂單類表中非常常見,下面我們以訂單表為例子進行說明。  www.aiwalls.com  

       

       
此時我們按照某種條件進行搜索,看看是否在指定的分區中搜索:

 

 

         此時,可以看到,查詢優化器隻需要去搜索p2008這個分區,而不會搜索所有的分區。

 

 

 

摘自 tenfyguo的技術專欄

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *