MySQL分區(qū)表的基本入門教程
前言
在最近的項(xiàng)目中,我們需要保存大量的數(shù)據(jù),而且這些數(shù)據(jù)是有有效期的,為了提供查詢效率以及快速刪除過期數(shù)據(jù),我們選擇了MySQL的分區(qū)機(jī)制。把數(shù)據(jù)按照時(shí)間進(jìn)行分區(qū)。
分區(qū)類型
- Range分區(qū):最為常用,基于屬于一個(gè)給定連續(xù)區(qū)間的列值,把多行分配給分區(qū)。最常見的是基于時(shí)間字段. 基于分區(qū)的列最好是整型,如果日期型的可以使用函數(shù)轉(zhuǎn)換為整型。
- List分區(qū):LIST分區(qū)和RANGE分區(qū)類似,區(qū)別在于LIST是枚舉值列表的集合,RANGE是連續(xù)的區(qū)間值的集合。
- Hash分區(qū):基于給定的分區(qū)個(gè)數(shù),將數(shù)據(jù)分配到不同的分區(qū),HASH分區(qū)只能針對(duì)整數(shù)進(jìn)行HASH,對(duì)于非整形的字段只能通過表達(dá)式將其轉(zhuǎn)換成整數(shù)。
- Key分區(qū):KEY分區(qū)其實(shí)跟HASH分區(qū)差不多,不同點(diǎn)如下:
- KEY分區(qū)允許多列,而HASH分區(qū)只允許一列。
- 如果在有主鍵或者唯一鍵的情況下,key中分區(qū)列可不指定,默認(rèn)為主鍵或者唯一鍵,如果沒有,則必須顯性指定列。
- KEY分區(qū)對(duì)象必須為列,而不能是基于列的表達(dá)式。
- KEY分區(qū)和HASH分區(qū)的算法不一樣,PARTITION BY HASH (expr),MOD取值的對(duì)象是expr返回的值,而PARTITION BY KEY (column_list),基于的是列的MD5值。
分區(qū)命令
創(chuàng)建分區(qū)
CREATE TABLE `access_log` ( `id` int(11) NOT NULL AUTO_INCREMENT, `access_time` datetime NOT NULL, PRIMARY KEY (`id`,`access_time`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 /*!50100 PARTITION BY RANGE (to_days(access_time)) (PARTITION p1 VALUES LESS THAN (to_days(20190101)) ENGINE = InnoDB, PARTITION p2 VALUES LESS THAN (to_days(20190102)) ENGINE = InnoDB, PARTITION p3 VALUES LESS THAN (to_days(20190103)) ENGINE = InnoDB) */;
創(chuàng)建后可以看到,每個(gè)分區(qū)都會(huì)對(duì)應(yīng)1個(gè)ibd文件

分區(qū)表
新增分區(qū)
alter table access_log add partition(
partition p4 values less than (to_days('20190105'))
);
刪除分區(qū)
alter table access_log drop partition p1;
拆分分區(qū)
alter table access_log reorganize partition p4 into(
-> partition s0 values less than(to_days('20190104')),
-> partition s1 values less than(to_days('20190105'))
-> );
合并分區(qū)
alter table access_log reorganize partition s0,s1 into (
partition p4 values less than (to_days('20190105'))
);
注意事項(xiàng)
- MySQL分區(qū)中如果存在主鍵或唯一鍵,則分區(qū)列必須包含在其中(否則判斷主鍵或唯一時(shí),需要掃描所有分區(qū))
- 分區(qū)字段不能為NULL,要不然怎么確定分區(qū)范圍呢,所以盡量NOT NULL
- 最大分區(qū)數(shù)目不能超過1024
- 不支持外鍵
- 只能對(duì)數(shù)據(jù)表的整型列進(jìn)行分區(qū),或者數(shù)據(jù)列可以通過分區(qū)函數(shù)轉(zhuǎn)化成整型列
- 分區(qū)表不影響自增列
常見問題
- A PRIMARY KEY must include all columns in the table's partitioning function:這樣的話判斷主鍵是否唯一就可以在單個(gè)分區(qū)內(nèi)部完成,否則就需要跨所有的分區(qū)
- MAXVALUE can only be used in last partition definition:RANGE表分區(qū)后不能帶MAXVALUE分區(qū),否則無法增加分區(qū)?;蛘呔椭荒苤匦路謪^(qū)了
alter table access_log partition by range(to_days(access_time))(
partition p1 values less than (to_days('20191202')),
partition p2 values less than (to_days('20191203')),
partition po values less than (maxvalue)
)
- Table has no partition for value 737425:因?yàn)榉謪^(qū)的范圍沒有包含所有可能的記錄的值
參考
- MySQL · 最佳實(shí)踐 · 分區(qū)表基本類型
- 互聯(lián)網(wǎng)公司為啥不使用mysql分區(qū)表?
- How to Resolve ERROR 1481 (HY000): MAXVALUE can only be used in last partition definition
總結(jié)
到此這篇關(guān)于MySQL分區(qū)表基本入門教程的文章就介紹到這了,更多相關(guān)MySQL分區(qū)表內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
MySQL實(shí)現(xiàn)快速刪除所有表而不刪除數(shù)據(jù)庫(kù)的方法
這篇文章主要介紹了MySQL實(shí)現(xiàn)快速刪除所有表而不刪除數(shù)據(jù)庫(kù)的方法,涉及mysql批量執(zhí)行語句的相關(guān)操作技巧,需要的朋友可以參考下2017-09-09
MYSQL 性能分析器 EXPLAIN 用法實(shí)例分析
這篇文章主要介紹了MYSQL 性能分析器 EXPLAIN 用法,結(jié)合實(shí)例形式分析了MYSQL 性能分析器 EXPLAIN 基本功能、使用方法及操作注意事項(xiàng),需要的朋友可以參考下2020-05-05
Mysql數(shù)據(jù)庫(kù)表定期備份的實(shí)現(xiàn)詳解
這篇文章主要介紹了Mysql數(shù)據(jù)庫(kù)表定期備份的實(shí)現(xiàn)詳解的相關(guān)資料,需要的朋友可以參考下2017-03-03
MySQL進(jìn)行大數(shù)據(jù)量分頁(yè)的優(yōu)化技巧分享
mysql大數(shù)據(jù)量分頁(yè)情況下性能會(huì)很差,所以本文就來講一講mysql大數(shù)據(jù)量下偏移量很大,性能很差的問題,并附上解決方式,希望對(duì)大家有所幫助2024-01-01
MyEclipse連接Mysql數(shù)據(jù)庫(kù)的方法(一)
這篇文章主要介紹了MyEclipse連接Mysql數(shù)據(jù)庫(kù)的方法(一)的相關(guān)資料,非常實(shí)用,具有參考價(jià)值,需要的朋友可以參考下2016-05-05
MySQL優(yōu)化器統(tǒng)計(jì)信息的配置指南
在 MySQL 中,查詢優(yōu)化器(Query Optimizer) 負(fù)責(zé)決定執(zhí)行 SQL 語句的最佳方式,比如是否使用某個(gè)索引、用哪個(gè)索引、是否進(jìn)行全表掃描等,本文給大家介紹了MySQL優(yōu)化器統(tǒng)計(jì)信息的配置指南,需要的朋友可以參考下2025-09-09
MySQL中CONCAT和GROUP_CONCAT方法的區(qū)別詳解
本文主要介紹了MySQL中CONCAT和GROUP_CONCAT方法的區(qū)別詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-01-01

