mysql分區實踐

數據庫中的數據達到一定上限時候,表查詢會很慢。我們常使用的策略就是對數據庫進行分表(大表分成多張小表)、分區(大表拆分成區)。
下面主要介紹分區的幾種方式和具體的實現

mac進入mysql命令模式

  1. 查找mysql安裝路徑:

    find /usr/ -iname "mysql"
  2. 設置mysql的別名

    alias mysql='/usr//local/mysql-5.6.35-macos10.12-x86_64/bin/mysql'
  3. 進入mysql

    mysql -u root -p 

mysql表分區

分區的好處

  • 可以把一些歸類的數據放在一個分區中,可以減少服務器檢查數據的數量加快查詢
  • 分區與不使用分區相比,能夠更好的維護數據。比如,可以很快的通過刪除分區來移除舊數據。我們還可以優化、檢查、修復個別分區
  • 屏蔽分表的 複雜性
    分區前的準備

1.查看建表語句是否存在分區

show create table m_book;

2.查看是否支持分區

show variables like '%part%';

mysql的分區包括四種分區、list分區、hash分區、key分區以及這四種互相的複合分區
常使用的是range和hash分區,這裏主要介紹如下:

range分區

range分區實踐

  1. 建表語句
    這裏是通過id來分區的,有可以根據時間或者其他有意義的字段。
CREATE TABLE `m_books` (\n  `id` int(11) NOT NULL AUTO_INCREMENT,\n  `name` varchar(45) NOT NULL,\n  `img_url` varchar(128) DEFAULT NULL,\n  `score` double DEFAULT \'0\',\n  `author` varchar(45) DEFAULT NULL,\n  `publish_company` varchar(45) DEFAULT NULL,\n  `publish_at` varchar(45) DEFAULT NULL,\n 
 `create_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,\n  PRIMARY KEY (`id`)\n) ENGINE=InnoDB AUTO_INCREMENT=453 DEFAULT CHARSET=utf8
 partition by range(id)(
    PARTITION p0 VALUES LESS THAN (100),  
    PARTITION p1 VALUES LESS THAN (200),  
    PARTITION p2 VALUES LESS THAN (300),  
    PARTITION p3 VALUES LESS THAN (400),  
    PARTITION p4 VALUES LESS THAN MAXVALUE
 );

2.插入數據
具體的數據,後面會提供

insert into m_books select * from books

驗證分區是否生效

思路是這樣的,先查詢表中的總數,然後刪除一個分區;再次查詢表中的總數。看是否有變化

-- 查詢現有數據,爲452
select count(*) from m_books
count
'452'
-- 刪除第二個分區
alter table m_books drop partition p2
-- 再次查詢數據,爲352
select count(id) from m_books
count
'452'

hash分區

  1. 把id作爲partition key來進行分區
-- 創建一個hash分區的表
 CREATE TABLE `h_books` 
( `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(45) NOT NULL,
  `img_url` varchar(128) DEFAULT NULL,
  `score` double DEFAULT 0,
  `author` varchar(45) DEFAULT NULL,
  `publish_company` varchar(45) DEFAULT NULL,
  `publish_at` varchar(45) DEFAULT NULL, 
 `create_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
 PRIMARY KEY (`id`)) 
 ENGINE=InnoDB AUTO_INCREMENT=453 DEFAULT CHARSET=utf8
 partition by hash(id) partitions 30;
  1. 查詢分區信息
 select partition_name part,partition_expression expr
 from information_schema.partitions where table_name='h_books'

這裏寫圖片描述
這裏遇到一個問題,當設置id爲主鍵時候,如果把create_at作爲partition Key來進行分區,此時mysql會不支持這麼做。我的操作是這樣的
* 重新定義時間作爲分區主鍵

alter table h_books partition by hash(unix_timestamp(create_at)) partitions 20; 

報錯信息

Error Code: 1503. A PRIMARY KEY must include all columns in the table's partitioning function

google一下原因,表的主鍵和patition的主鍵需要保持一致,MYSQL的分區字段,必須包含在主鍵字段內
將table設置爲id和create_at的複合主鍵,於是創建時間的partition分區成功!

 CREATE TABLE `h_books` 
( `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(45) NOT NULL,
  `img_url` varchar(128) DEFAULT NULL,
  `score` double DEFAULT 0,
  `author` varchar(45) DEFAULT NULL,
  `publish_company` varchar(45) DEFAULT NULL,
  `publish_at` varchar(45) DEFAULT NULL, 
 `create_at` date,
 PRIMARY KEY (`id`,`create_at`)) 
 ENGINE=InnoDB AUTO_INCREMENT=453 DEFAULT CHARSET=utf8
 partition by hash(to_days(`create_at`)) partitions 30;

複合分區

MySQL中的四種分區類型能夠組合成多種複合分區,如:RANGE-HASH、RANGE-KEY、LIST-HASH、LIST-KEY等。

  • 重點是RANGE-HASH複合分區
CREATE TABLE `f_books` 
( `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(45) NOT NULL,
  `img_url` varchar(128) DEFAULT NULL,
  `score` double DEFAULT 0,
  `author` varchar(45) DEFAULT NULL,
  `publish_company` varchar(45) DEFAULT NULL,
  `publish_at` varchar(45) DEFAULT NULL, 
 `create_at` date,
 PRIMARY KEY (`id`,`create_at`)
 ) 
 ENGINE=InnoDB AUTO_INCREMENT=453 DEFAULT CHARSET=utf8
 partition by range(`id`)
 subpartition by hash(to_days(`create_at`)) subpartitions 3
 (
    partition p1 values less than (100),
    partition p2 values less than maxvalue
 );

上面主分區是range,分爲2個區;下面是hash分區,分爲3個區;總共分爲2*3個區。

  • 查詢分區信息:
 select partition_name part,partition_expression expr,subpartition_name subPart,subpartition_expression as subExpr
 from information_schema.partitions where table_name='f_books'

這裏寫圖片描述

分區操作的sql介紹

刪除分區

 alter table f_books drop partition p2;

增加分區

alter table f_books add partition (partition p3 values less than (200));

參考博文
1. 還有一些其他的sql語法,這裏可以參考
http://www.wiquan.com/article/669
2. 複合分區的詳細介紹參考:http://www.cnblogs.com/ivictor/p/5026640.html
3. http://blog.51yip.com/mysql/1013.html
4. https://my.oschina.net/u/617773/blog/135963

發佈了206 篇原創文章 · 獲贊 82 · 訪問量 38萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章