前言:在生產庫下對乙個1000萬行的表進行分割槽,經過分析,根據ctime(datetime)欄位range型按月進行分割槽.該錶特點:
1.閒時每分鐘產生約100行資料
2.只有insert修改,select查詢,沒有delete,update,replace等修改
3.有一列自增列
4 . 資料庫版本percona-server-5.1.57-rel12.8-232-linux-x86_64
從未分割槽到分割槽的遷移方案.如下:
db_name="production"
# 找出當前位置,匯出當前的表
mark_id=`mysql $db_name -e "select max(id) from production_tb;"`
mysqldump --default-character-set=utf8 $db_name production_tb > production_tb.sql
# 建立分割槽表 , 禁止索引
primary key (id,ctime), #分割槽列必須是主鍵
key idx_source_subid (source,sub_id),
key idx_reg_time (ctime),
key idx_source (source),
key idx_click_ip (ip)
) engine=myisam auto_increment=0 default charset=utf8
partition by range (to_days(ctime))
partition p201012 values less than (to_days('2011-01-01')),
partition p201101 values less than (to_days('2011-02-01')) ,
partition p201102 values less than (to_days('2011-03-01')) ,
partition p201103 values less than (to_days('2011-04-01')) ,
partition p201104 values less than (to_days('2011-05-01')) ,
partition p201105 values less than (to_days('2011-06-01')) ,
partition p201106 values less than (to_days('2011-07-01')) ,
partition p201107 values less than (to_days('2011-08-01')) ,
partition p201108 values less than (to_days('2011-09-01')) ,
partition p201109 values less than (to_days('2011-10-01')) ,
partition p201110 values less than (to_days('2011-11-01')),
partition p201111 values less than (to_days('2011-12-01')),
partition p201112 values less than (to_days('2012-01-01')),
partition pmax values less than maxvalue );
alter table production_tb_partition disable keys;
eof# dump出來的檔案, 只保留insert語句,更改表名
grep -i insert production_tb.sql > production_tb_partition.sql
sed -i -e "s%production_tb%production_tb_partition%g" production_tb_partition.sql
time mysql --default-character-set=utf8 $db_name
# 分割槽表重新命名為正式表
rename table production_tb to production_tb_nopart;
rename table production_tb_partition to production_tb;
# 在會話中鎖定正式表唯讀,將新資料庫匯入正式表
lock tablesproduction_tbread;insert intoproduction_tb
select* from production_tb_nopart where id > $mark_id;
unlock tables;
# enable正式表的key
alter table production_tb_partition enable keys;
備註 :
1.效率問題
a.直接alter為分割槽表 (未分割槽前ctime不是主鍵,無法測試)
b.新錶 insert前 未 disable key 72min
c.新錶insert前 disable key 10min (本方案)
2. 之前效率問題測試引發的資料儲存問題
explain同乙個查詢,a方案,b方案,c方案 ,掃瞄到的行數不同.
a方案 424964 rows
b方案 322415 rows
c方案 231766 rows
MySQL資料庫分割槽
資料庫分割槽處理 如果一張表的資料量太大的話,myd myi就會變得很大,查詢資料就會變的很慢,我接觸到的是有關溫州計程車網約車gps資料量的查詢,大概資料量為1天4000萬條記錄,不分割槽查詢速度慢到懷疑人生。在物理上我們可以把資料表分割成不同的小塊,查詢資料只需要查詢需要的那一塊資料即可,查詢速...
mysql 資料庫表分割槽
create table if not exists demo range eventid int 11 unsigned not null,event sk int 11 not null,product sk int 11 not null,date sk int 11 not null,dev...
sql 生產庫全備 mysql庫體積大小檢視
兩個思路 1,直接內網mysqldump匯出.解決 通過ssh tunnel連線內網ecs和rds 1.檢視資料庫的大小 use mydb select sum data length sum index length from information schema.tables where tab...