(一)、分割槽的限制:
1.主鍵或者唯一索引必須包含分割槽字段,如primary key (id,username),不過innodb的大組建效能不好。
2.很多時候,使用分割槽就不要在使用主鍵了,否則可能影響效能。
3.只能通過int型別的字段或者返回int型別的表示式來分割槽,通常使用year或者to_days等函式(mysql 5.6 對限制開始放開了)。
4.每個表最多1024個分割槽,而且多分割槽會大量消耗記憶體。
5.分割槽的表不支援外來鍵,相關的邏輯約束需要使用程式來實現。
6.分割槽後,可能會造成索引失效,需要驗證分割槽可行性。
(二)、分割槽實現:
第一步:新增日期作為主鍵部分
alter table erp_bill_index drop primary key;-- 刪除主鍵 201s
alter table erp_bill_index add primary key(billid,billdate);-- 新增主鍵203s
第二步:建立分割槽
alter table erp_bill_index partition by range(to_days(billdate))
( partition p201801 values less than (to_days('2018-02-01')),
partition p201802 values less than (to_days('2018-03-01')),
partition p201803 values less than (to_days('2018-04-01')),
partition p201804 values less than (to_days('2018-05-01')),
partition p201805 values less than (to_days('2018-06-01')),
partition p201806 values less than (to_days('2018-07-01')),
partition p201807 values less than (to_days('2018-08-01')),
partition p201808 values less than (to_days('2018-09-01')),
partition p201809 values less than (to_days('2018-10-01')),
partition p201810 values less than (to_days('2018-11-01')),
partition p201811 values less than (to_days('2018-12-01')),
partition p201812 values less than (to_days('2019-01-01')),
partition p201901 values less than (to_days('2019-02-01')),
partition p201902 values less than (to_days('2019-03-01')),
partition p201903 values less than (to_days('2019-04-01')),
partition p201904 values less maxvalue
);
第三步:新增分割槽alter table erp_bill_index add partition
(partition p201905 values less than (to_days(『2019-06-01』)) engine = innodb
)第四部步:自動新增分割槽
delimiter katex parse error: expected 'eof', got '#' at position 2: #̲該錶所在資料庫名稱 use `…
drop procedure if existscreate_partition_by_month
katex parse error: expected 'eof', got '#' at position 110: …64)) begin #̲當前日期存在的分割槽的個數 …
delimiter ;
第五步:定時任務
delimiter katex parse error: expected 'eof', got '#' at position 2: #̲該錶所在的資料庫名稱 use …
create event if not existsmonth_generate_partition
on schedule every 1 month #執行週期,還有天、月等等
starts 『2019-04-01 00:00:00』
on completion preserve
enable
comment 『creating partitions』
do begin
#呼叫剛才建立的儲存過程,第乙個引數是資料庫名稱,第二個引數是表名稱
call testtable.create_partition_by_month(『testtable』,『erp_bill_index』);
end$$
delimiter ;
(三)、處理定時任務不執行問題:
show variables like 『event_scheduler』
set global event_scheduler = 1;
開啟事件:
alter event event_name on completion preserve enable; /event_name 事件名稱/
相應檔案
c:\programdata\mysql\mysql server 5.7\my.ini skip-grant-tables
(四)、問題整理
1)、錯誤:table has no partition for value 738059(沒有包含所有資料)
先查詢最大值
select billdate from erp_bill_index where billdate>『2019-05-01』 order by billdate desc limit 0,20;
在新增最大分割槽;
2)、建立分割槽之後,查詢時解析可以看到使用分割槽情況:
explain
select billdate from erp_bill_index_test where billdate>『2019-05-01』 order by billdate desc limit 0,20;
Mysql表分割槽實現
一 分割槽的限制 1.主鍵或者唯一索引必須包含分割槽字段,如primary key id,username 不過innodb的大組建效能不好。2.很多時候,使用分割槽就不要在使用主鍵了,否則可能影響效能。3.只能通過int型別的字段或者返回int型別的表示式來分割槽,通常使用year或者to day...
mysql表分割槽全文搜尋 Mysql表分割槽
什麼時候使用分割槽 海量資料 資料表索引大於伺服器有效記憶體 分割槽的限制 大部分只能對資料表的整型列進行分割槽,或者資料列可以通過分割槽函式轉化成整型列 其中columns支援 integer string date datetime型別 最大分割槽數目不能超過1024 如果含有唯一索引或者主鍵,...
mysql表分割槽
表分割槽的優點 查詢優化 缺點 除了資料庫管理方面複雜了點,其它的還沒有發現 只有5.1及之後的版本才支付分割槽,同時5.1中分割槽的一些維護的工具還不完善 mysql目前四種分割槽 1range 根據某個列的某種運算進行分割槽,分割槽的標誌都是該列的某種運算後的連續區間 create table ...