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
- 實現MySQL表結構自動分割槽指令碼MySql指令碼
- mysql 進行表分割槽MySql
- HGDB的分割槽表實現SQL Server的分割槽檢視SQLServer
- PostgreSQL使用表繼承實現分割槽表SQL繼承
- 分割槽表-實戰
- MySQL調優之分割槽表MySql
- MySQL 分割槽表知識整理MySql
- oracle分割槽表和分割槽表exchangeOracle
- (3) MySQL分割槽表使用方法MySql
- MySQL資料表分割槽手記MySql
- mysql~關於mysql分割槽表的測試MySql
- oracle分割槽表和非分割槽表exchangeOracle
- mysql 分割槽MySql
- mysql分割槽表佔用大量容量處理(最佳化)及歸檔分割槽表MySql
- 第41期:MySQL 雜湊分割槽表MySql
- 第40期:MySQL 分割槽表案例分享MySql
- MySQL線上轉分割槽表(以及TiDB)MySqlTiDB
- MySql分表、分庫、分片和分割槽MySql
- MySQL分表後原分割槽表處理方案MySql
- PostgreSQL/LightDB 分割槽表之分割槽裁剪SQL
- PG的非分割槽表線上轉分割槽表
- 理解MySQL分割槽MySql
- 搞懂MySQL分割槽MySql
- MySql建立分割槽MySql
- 非分割槽錶轉換成分割槽表
- [oracle] expdp 匯出分割槽表的分割槽Oracle
- Oracle分割槽表基礎運維-07增加分割槽(3列表分割槽)Oracle運維
- Oracle12c:建立主分割槽、子分割槽,實現自動分割槽插入效果Oracle
- oracle 分割槽表move和包含分割槽表的lob moveOracle
- 移動分割槽表和分割槽索引的表空間索引
- MySQL全面瓦解29:使用Partition功能實現水平分割槽MySql
- 第38期:MySQL 時間類分割槽具體實現MySql
- MySql資料分割槽操作之新增分割槽操作MySql
- Oracle分割槽表基礎運維-04列表分割槽Oracle運維
- MySQL的分割槽(一)MySql