Mysql自動分割槽

2021-08-21 15:45:49 字數 3415 閱讀 9722

​ 前提:

​ test為資料庫名

​ ip_demo為表名

建立分割槽

alter

table ip_demo partition by range(to_days(date))

(partition p20180716 values less than (to_days('2018-07-17'))

)

注意:這裡date必須為主鍵,否則建立失敗。但是在表中不設定主鍵的時候,同樣可以新建分割槽成功

檢視當前表的分割槽資訊

select partition_name,subpartition_name,table_rows

from information_schema.`partitions`

where table_name = 'ip_demo';

新建分割槽儲存過程

delimiter $$

/*test為資料庫名*/

use `test`$$

/* 刪除儲存過程,確保新建成功*/

drop

procedure

ifexists

`create_partition_ip`$$

create definer=`root`@`localhost`

procedure

`create_partition_ip`()

begin

/* 事務回滾,其實放這裡沒什麼作用,alter

table是隱式提交,回滾不了的。*/

declare exit handler

for sqlexception rollback;

start

transaction;

/* 到系統表查出這個表的最大分割槽,得到最大分割槽的日期。在建立分割槽的時候,名稱就以日期格式存放,方便後面維護 */

select

replace(partition_name,'p','') into @p12_name from information_schema.partitions

where table_name='ip_demo'

order

by partition_ordinal_position desc limit 1;

set @max_date= date(date_add(@p12_name+0, interval

1day))+0;

set @max_date_add= date(date_add(@p12_name+0, interval

2day))+0;

/* 修改表,在最大分割槽的後面增加乙個分割槽,時間範圍加1天 */

set @s1=concat('alter table ip_demo add partition (partition p',@max_date,' values less than (to_days (''',date(@max_date_add),''')))');

/* alter table ip_demo add partition (partition p20181230 values less than (to_days ('2018-12-31')))

*//* 輸出檢視增加分割槽語句*/

select @s1;

prepare stmt2 from @s1;

execute stmt2;

deallocate prepare stmt2;

/* 取出最小的分割槽的名稱,並刪除掉 。

注意:刪除分割槽會同時刪除分區內的資料,慎重 */

/*select partition_name into @p0_name from information_schema.partitions

where table_name='tb_3a_huandan_detail' order by partition_ordinal_position limit 1;

set @s=concat('alter table tb_3a_huandan_detail drop partition ',@p0_name);

prepare stmt1 from @s;

execute stmt1;

deallocate prepare stmt1; */

/* 提交 */

commit ;

end$$

delimiter ;

檢視所有的儲存過程

show procedure

status;

檢視定時任務支援

show variables like

'event_scheduler'

/*若結果為

event_scheduler on

代表定時任務開啟

若為off則需要手動開啟

setglobal event_scheduler = on;

最好通過my.cnf配置檔案進行修改

mysqld標籤下插入

event_scheduler = on

再重啟伺服器

*/

定時執行

delimiter ||  

create event partition_3ahuadan_event

on schedule

every 1

second starts '2018-07-16 11:19:59'

dobegin

call test.`create_partition_ip`;

end ||

delimiter ;

檢視所有event

show events

select * from mysql.event;

select * from information_schema.events;

刪除event

drop event if

exists partition_3ahuadan_event(event名稱)

檢視具體的查詢使用的分割槽和行數

explain partitions 

select * from ip_demo

where

date between '2018-07-16'

and'2018-07-19';

刪除分割槽操作

alter

table ip_demo drop partition p2018-07-16;

參考文章

[mysql每天自動增加分割槽]:

[mysql 定時自動新增分割槽]:

mysql自動建立分割槽

call insert partition 2018 07 07 2019 01 01 儲存過程 begin declare nowdate date declare endtmp date declare dt varchar 256 declare partitiontemp varchar 2...

mysql按周自動分割槽 MySQL自動按周分割槽

我建立了乙個表來記錄我的應用程式的活動.該錶將記錄每月超過2百萬條記錄.所以我想按月或按周使用分割槽 create table if not exists ul log logid int 20 not null auto increment,logdate datetime null,assess...

MySQL每天自動增加分割槽

參考 有乙個表tb 3a huandan detail,每天有300w左右的資料。查詢太慢了,網上了解了一下,可以做表分割槽。由於資料較大,所以決定做定時任務每天執行存過自動進行分割槽。1 在進行自動增加分割槽前一定得先對錶手動分幾個區 alter table tb 3a huandan detai...