mysql partition 功能
2013年7月30日
沒有評論
自mysql 5.1.3起開始支持分區功能。mysql表中存儲的記錄和表對應的索引信息,最后都是以文件的方式存儲在計算機的硬盤上的,有了分區功能,就可以按照一定的分區規則把這些記錄分布到不同的數據文件上,目前分區規則有四種,分別是RANGE、LIST、HASH和KEY,另外通過DATA DIRECTORY和INDEX DIRECTORY選項可以把不同的分區數據文件分散到不同的磁盤上,從而進步一提高系統的IO吞吐量。因此按照業務邏輯設計好了分區,可以大大提高查詢效率,而且刪除數據可能也會很容易。但是分區也有一些限制:1、主鍵或者唯一索引必須包含分區字段;2、只能通過int類型的字段或者返回int類型的表達式來分區;3、單表最多只能有1024個分區。
默認mysql是開啟了分區功能的,可以通過下述查詢查看結果:
show variables like '%partition%'; +-------------------+-------+ | Variable_name | Value | +-------------------+-------+ | have_partitioning | YES | +-------------------+-------+ //YES 表示開啟
下面也range規則為例介紹一下分區常用的命令。
1、創建分區。可以在創建表的同時創建,也可以在表創建后追加分區。
drop table if exists `netingcn_com`; create table `netingcn_com` ( `id` int(11) unsigned not null auto_increment, `day` int(11) not null default 0, primary key (`id`, `day`) ) engine=innodb default charset=utf8 auto_increment=1; alter table `netingcn_com` partition by range(`day`) ( partition p_2012 values less than (20130000), partition p_2013 values less than (20140000) ); 或 drop table if exists `netingcn_com`; create table `netingcn_com` ( `id` int(11) unsigned not null auto_increment, `day` int(11) not null default 0, primary key (`id`, `day`) ) engine=innodb default charset=utf8 auto_increment=1 partition by range(`day`) ( partition p_2012 values less than (20130000), partition p_2013 values less than (20140000) ); 可以explain命令查看分區是否創建成功 explain partitions select * from netingcn_com where day = 20130412; +----+-------------+--------------+------------+-------+ | id | select_type | table | partitions | type | +----+-------------+--------------+------------+-------+ | 1 | SIMPLE | netingcn_com | p_2013 | index | +----+-------------+--------------+------------+-------+
2、增加或刪除分區。注意:刪除分區的同時,該分區的所有數據也會別刪除。
增加分區 alter table netingcn_com add partition ( partition p_2014 values less than (20150000) ); 刪除分區 alter table netingcn_com drop partition p_2012;
3、重新分區。注意:hash和key分區規則不能用REORGANIZE來重新分區
alter table netingcn_com reorganize partition p_2013,p_2014 into (partition p_2014 values less than (20150000));
更多關于mysql 分區功能可以參考:http://dev.mysql.com/tech-resources/articles/mysql_55_partitioning.html