Mysql表分割槽實現
Mysql表分割槽實現
(一)、分割槽的限制:
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 EXISTS create_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 EXISTS month_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 事件名稱/
處理問題:
地址:https://zhidao.baidu.com/question/1543863766414881427.html
相應檔案
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】 分割槽表MySql
- MySQL 分割槽表MySql
- MySQL分割槽表MySql
- postgresql分割槽表實現方式SQL
- MySQL分割槽的實現方式MySql
- MySQL 分割槽表探索MySql
- mysql 分表 分割槽MySql
- mysql 分割槽表用法MySql
- MySQL表分割槽管理MySql
- 實現MySQL表結構自動分割槽指令碼MySql指令碼
- OGG Oracle 分割槽壓縮表 到 MySQL分表的實現OracleMySql
- MySQL 分割槽表 partition線上修改分割槽欄位MySql
- HGDB的分割槽表實現SQL Server的分割槽檢視SQLServer
- mysql 進行表分割槽MySql
- mysql分割槽表筆記MySql筆記
- MySQL入門--分割槽表MySql
- mysql —— 分表分割槽(1)MySql
- MySQL的List分割槽表MySql
- PostgreSQL使用表繼承實現分割槽表SQL繼承
- MySQL分割槽表的分割槽原理和優缺點MySql
- 將mysql非分割槽錶轉換為分割槽表MySql
- 分割槽表-實戰
- MySQL 分割槽表知識整理MySql
- MySQL調優之分割槽表MySql
- mysql的分割槽和分表MySql
- mysql的分割槽與分表MySql
- mysql分割槽表小結2MySql
- 【實驗】【PARTITION】RANGE分割槽表合併分割槽
- 【實驗】【PARTITION】RANGE分割槽表增加分割槽
- 【實驗】【PARTITION】RANGE分割槽表刪除分割槽
- mysql表水平拆分和分割槽分表MySql
- 【實驗】【PARTITION】RANGE分割槽表截斷表分割槽(Truncate Partition)
- 【實驗】【PARTITION】RANGE分割槽表移動表分割槽(Move Partition)
- oracle分割槽表和分割槽表exchangeOracle
- MySQL資料表分割槽手記MySql
- (3) MySQL分割槽表使用方法MySql
- mysql之分割槽表小結1MySql
- 全面學習分割槽表及分割槽索引(13)--分隔表分割槽索引