国产激情自拍_国产9色视频_丁香花在线电影小说观看 _久久久久国产精品嫩草影院

首頁 > 數(shù)據(jù)庫 > MySQL > 正文

MySQL分區(qū)表的正確使用方法

2024-07-25 19:09:29
字體:
供稿:網(wǎng)友

MySQL分區(qū)表概述

我們經(jīng)常遇到一張表里面保存了上億甚至過十億的記錄,這些表里面保存了大量的歷史記錄。 對于這些歷史數(shù)據(jù)的清理是一個非常頭疼事情,由于所有的數(shù)據(jù)都一個普通的表里。所以只能是啟用一個或多個帶where條件的delete語句去刪除(一般where條件是時間)。 這對數(shù)據(jù)庫的造成了很大壓力。即使我們把這些刪除了,但底層的數(shù)據(jù)文件并沒有變小。面對這類問題,最有效的方法就是在使用分區(qū)表。最常見的分區(qū)方法就是按照時間進(jìn)行分區(qū)。

分區(qū)一個最大的優(yōu)點就是可以非常高效的進(jìn)行歷史數(shù)據(jù)的清理。

1. 確認(rèn)MySQL服務(wù)器是否支持分區(qū)表

命令:

show plugins;

MySQL,分區(qū)表

2. MySQL分區(qū)表的特點

在邏輯上為一個表,在物理上存儲在多個文件中

HASH分區(qū)(HASH)

HASH分區(qū)的特點

  • 根據(jù)MOD(分區(qū)鍵,分區(qū)數(shù))的值把數(shù)據(jù)行存儲到表的不同分區(qū)中
  • 數(shù)據(jù)可以平均的分布在各個分區(qū)中
  • HASH分區(qū)的鍵值必須是一個INT類型的值,或是通過函數(shù)可以轉(zhuǎn)為INT類型

如何建立HASH分區(qū)表

以INT類型字段 customer_id為分區(qū)鍵

CREATE TABLE `customer_login_log` ( `customer_id` int(10) unsigned NOT NULL COMMENT '登錄用戶ID', `login_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '用戶登錄時間', `login_ip` int(10) unsigned NOT NULL COMMENT '登錄IP', `login_type` tinyint(4) NOT NULL COMMENT '登錄類型:0未成功 1成功') ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='用戶登錄日志表'PARTITION BY HASH(customer_id) PARTITIONS 4;

以非INT類型字段 login_time 為分區(qū)鍵(需要先轉(zhuǎn)換成INT類型)

CREATE TABLE `customer_login_log` ( `customer_id` int(10) unsigned NOT NULL COMMENT '登錄用戶ID', `login_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '用戶登錄時間', `login_ip` int(10) unsigned NOT NULL COMMENT '登錄IP', `login_type` tinyint(4) NOT NULL COMMENT '登錄類型:0未成功 1成功') ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='用戶登錄日志表'PARTITION BY HASH(UNIX_TIMESTAMP(login_time)) PARTITIONS 4;

customer_login_log 表如果不分區(qū),在物理磁盤上文件為

customer_login_log.frm # 存儲表原數(shù)據(jù)信息customer_login_log.ibd # Innodb數(shù)據(jù)文件

如果按上面的建HASH分區(qū)表,則有五個文件

customer_login_log.frm customer_login_log#P#p0.ibdcustomer_login_log#P#p1.ibdcustomer_login_log#P#p2.ibdcustomer_login_log#P#p3.ibd

演示

MySQL,分區(qū)表

MySQL,分區(qū)表

MySQL,分區(qū)表

使用起來和不分區(qū)是一樣的,看起來只有一個數(shù)據(jù)庫,其實有多個分區(qū)文件,比如我們要插入一條數(shù)據(jù),不需要指定分區(qū),MySQL會自動幫我們處理

MySQL,分區(qū)表

查詢

MySQL,分區(qū)表

范圍分區(qū)(RANGE)

RANGE分區(qū)特點

  • 根據(jù)分區(qū)鍵值的范圍把數(shù)據(jù)行存儲到表的不同分區(qū)中
  • 多個分區(qū)的范圍要連續(xù),但是不能重疊
  • 默認(rèn)情況下使用VALUES LESS THAN屬性,即每個分區(qū)不包括指定的那個值

如何建立RANGE分區(qū)

MySQL,分區(qū)表

如果沒有定義p3分區(qū),當(dāng)插入的customer_id大于29999時會報錯,定義了則超過的數(shù)據(jù)都存入p3中

RANGE分區(qū)的適用場景

  • 分區(qū)鍵為日期或是時間類型 (可以使得各個分區(qū)表的數(shù)據(jù)比較均衡,如果按上面的例子中以整型id為分區(qū)鍵,假如活躍用戶集中在10000-19999之間,則p1中的數(shù)據(jù)量就會比其他分區(qū)的數(shù)據(jù)量大很多,這就失去了分區(qū)的意義;而且按時間類型分區(qū),如果要按時間順序進(jìn)行數(shù)據(jù)的歸檔,則只需要對某一個分區(qū)進(jìn)行歸檔就可以了)
  • 所有查詢中都包括分區(qū)鍵(避免跨分區(qū)查詢)
  • 定期按分區(qū)范圍清理歷史數(shù)據(jù)

LIST分區(qū)

LIST分區(qū)的特點

  • 按分區(qū)鍵取值的列表進(jìn)行分區(qū)
  • 同范圍分區(qū)一樣,各分區(qū)的列表值不能重復(fù)
  • 每一行數(shù)據(jù)必須能找到對應(yīng)的分區(qū)列表,否則數(shù)據(jù)插入失敗

如何建立LIST分區(qū)

MySQL,分區(qū)表

如果插入一條login_type為10的數(shù)據(jù)行,則會報錯

3. 如何為登錄日志表(customer_login_log)分區(qū)

業(yè)務(wù)場景

  • 用戶每次登錄都會記錄customer_login_log日志
  • 用戶登錄日志保存一年,1年后可以刪除或者歸檔

登錄日志表的分區(qū)類型及分區(qū)鍵

  • 使用RANGE分區(qū)
  • 以login_time為分區(qū)鍵

分區(qū)后的用戶登錄日志表

按年份分區(qū)存儲,所以用YEAR函數(shù)進(jìn)行了轉(zhuǎn)化

CREATE TABLE `customer_login_log` ( `customer_id` int(10) unsigned NOT NULL COMMENT '登錄用戶ID', `login_time` DATETIME NOT NULL COMMENT '用戶登錄時間', `login_ip` int(10) unsigned NOT NULL COMMENT '登錄IP', `login_type` tinyint(4) NOT NULL COMMENT '登錄類型:0未成功 1成功') ENGINE=InnoDB PARTITION BY RANGE (YEAR(login_time))(PARTITION p0 VALUES LESS THAN (2017),PARTITION p1 VALUES LESS THAN (2018),PARTITION p2 VALUES LESS THAN (2019)) 

插入并查詢數(shù)據(jù)

MySQL,分區(qū)表

查詢指定表中的分區(qū)數(shù)據(jù)情況

SELECT table_name,partition_name,partition_description,table_rows FROMinformation_schema.`PARTITIONS` WHERE table_name = 'customer_login_log';

MySQL,分區(qū)表

再插入2條18年的日志,會存入p2表中

MySQL,分區(qū)表

之前說過建立分區(qū)表時,最好建立一個MAXVALUE的分區(qū),這里之所以沒有建立,是為了數(shù)據(jù)維護(hù)的方便,如果我們建立了MAXVALUE分區(qū),很容易忽視一個問題,當(dāng)我們2019年有的數(shù)據(jù)插入時,會自動存入那個MAXVALUE分區(qū)中,之后在做數(shù)據(jù)維護(hù)時會不方便,所以沒有建立MAXVALUE分區(qū)

而是通過計劃任務(wù)的方式,在每年年底的時候增加這個分區(qū),比如我們現(xiàn)在在2018年年底,我們需要在日志表中為2019年建立日志分區(qū),否則2019年的日志都會插入失敗

MySQL,分區(qū)表

我們可以通過下面語句

增加分區(qū)

ALTER TABLE customer_login_log ADD PARTITION (PARTITION p3 VALUES LESS THAN(2020))

增加分區(qū),并插入數(shù)據(jù)

MySQL,分區(qū)表

刪除分區(qū)

假如我們現(xiàn)在要刪除2016年到2017年間一年的數(shù)據(jù),因為我們已經(jīng)做了分區(qū),所以只需要通過一條語句,刪除p0分區(qū)即可

ALTER TABLE customer_login_log DROP PARTITION p0;

MySQL,分區(qū)表

可以發(fā)現(xiàn)p0分區(qū)已被刪除,且2016年的日志全部被清除了

歸檔分區(qū)歷史數(shù)據(jù)

我們可能有另一種需求對數(shù)據(jù)進(jìn)行歸檔

Mysql版本>=5.7,歸檔分區(qū)歷史數(shù)據(jù)非常方便,提供了一個交換分區(qū)的方法

分區(qū)數(shù)據(jù)歸檔遷移條件:

  • MySQL>=5.7
  • 結(jié)構(gòu)相同
  • 歸檔到的數(shù)據(jù)表一定要是非分區(qū)表
  • 非臨時表;不能有外鍵約束
  • 歸檔引擎要是:archive

建表并交換分區(qū)

CREATE TABLE `arch_customer_login_log` ( `customer_id` INT unsigned NOT NULL COMMENT '登錄用戶ID', `login_time` DATETIME NOT NULL COMMENT '用戶登錄時間', `login_ip` INT unsigned NOT NULL COMMENT '登錄IP', `login_type` TINYINT NOT NULL COMMENT '登錄類型:0未成功 1成功') ENGINE=InnoDB ;ALTER TABLE customer_login_log  exchange PARTITION p1 WITH TABLE arch_customer_login_log;

MySQL,分區(qū)表

MySQL,分區(qū)表

MySQL,分區(qū)表

可以發(fā)現(xiàn),原customer_login_log表中的2017年的數(shù)據(jù)(p1分區(qū)中的數(shù)據(jù))已轉(zhuǎn)移到了arch_customer_login_log表中,但是p1分區(qū)未刪除,只是數(shù)據(jù)轉(zhuǎn)移了,所以我們還需要執(zhí)行DROP命令刪除分區(qū),以免有數(shù)據(jù)插入其中

將歸檔數(shù)據(jù)的存儲引擎改為歸檔引擎

最后我們將歸檔數(shù)據(jù)的存儲引擎改為歸檔引擎,命令為

ALTER TABLE customer_login_log ENGINE=ARCHIVE;

使用歸檔引擎的好處是:它比Innodb所占用的空間更少,但是歸檔引擎只能進(jìn)行查詢操作,不能進(jìn)行寫操作

4. 使用分區(qū)表的主要事項

  • 結(jié)合業(yè)務(wù)場景選擇分區(qū)鍵,避免跨分區(qū)查詢
  • 對分區(qū)表進(jìn)行查詢最好在WHERE從句中包含分區(qū)鍵
  • 具有主鍵或唯一索引的表,主鍵或唯一索引必須是分區(qū)鍵的一部分(這也是為什么我們上面分區(qū)時去掉了主鍵登錄日志id(login_id)的原因,不然就無法按照上面的按年份進(jìn)行分區(qū),所以分區(qū)表其實更適合在MyISAM引擎中)

關(guān)于MyISAM和Innodb的索引區(qū)別

1.關(guān)于自動增長

myisam引擎的自動增長列必須是索引,如果是組合索引,自動增長可以不是第一列,他可以根據(jù)前面幾列進(jìn)行排序后遞增。

innodb引擎的自動增長咧必須是索引,如果是組合索引也必須是組合索引的第一列。

2.關(guān)于主鍵

myisam允許沒有任何索引和主鍵的表存在,

myisam的索引都是保存行的地址。

innodb引擎如果沒有設(shè)定主鍵或者非空唯一索引,就會自動生成一個6字節(jié)的主鍵(用戶不可見)

innodb的數(shù)據(jù)是主索引的一部分,附加索引保存的是主索引的值。

3.關(guān)于count()函數(shù)

myisam保存有表的總行數(shù),如果select count(*) from table;會直接取出出該值

innodb沒有保存表的總行數(shù),如果使用select count(*) from table;就會遍歷整個表,消耗相當(dāng)大,但是在加了wehre 條件后,myisam和innodb處理的方式都一樣。

4.全文索引

myisam支持 FULLTEXT類型的全文索引

innodb不支持FULLTEXT類型的全文索引,但是innodb可以使用sphinx插件支持全文索引,并且效果更好。(sphinx 是一個開源軟件,提供多種語言的API接口,可以優(yōu)化mysql的各種查詢)

5.delete from table

使用這條命令時,innodb不會從新建立表,而是一條一條的刪除數(shù)據(jù),在innodb上如果要清空保存有大量數(shù)據(jù)的表,最 好不要使用這個命令。(推薦使用truncate table,不過需要用戶有drop此表的權(quán)限)

6.索引保存位置

myisam的索引以表名+.MYI文件分別保存。

innodb的索引和數(shù)據(jù)一起保存在表空間里。

總結(jié)

以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,如果有疑問大家可以留言交流,謝謝大家對VeVb武林網(wǎng)的支持。


注:相關(guān)教程知識閱讀請移步到MYSQL教程頻道。
發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
国产激情自拍_国产9色视频_丁香花在线电影小说观看 _久久久久国产精品嫩草影院
国产偷窥洗澡视频| 国产成人精品自线拍| 午夜视频在线看| 国自产拍在线网站网址视频| 欧美日韩在线视频免费观看| 青青草在线免费观看| 久久香蕉av| 国产系列在线观看| 国产激情三区| 在线观看的网站你懂的| 超碰免费在线播放| 国产特级淫片免费看| 精品一区二区三区免费站| 亚洲精品成人a| 国产免费av高清在线| 国产精品理人伦一区二区三区| 69日小视频在线观看| 亚洲国产成人综合| 丁香花高清视频完整版在线观看| 五月天亚洲激情| jizz一区二区三区| 中文字幕在线观看av| 在线视频三级| 国产美女被草| 小说区乱图片区| 国产激情视频在线| 国产精选一区二区三区不卡催乳| 2021av在线| 国产卡二和卡三的视频| 伊人影院在线播放| 午夜国产福利在线| 国产毛片在线| 九九在线观看免费视频| 亚洲第一成年免费网站| 国产不卡在线| 精品a在线观看| 在线午夜视频| 中文av在线播放| 国产精品人人| 国产日产一区二区| 国产羞羞视频在线观看| 国产美女视频一区二区二三区| 亚洲私人影吧| 亚洲成人av高清| 日本视频在线观看一区二区三区| 一区二区三区四区在线免费视频| 精品极品三级久久久久| 国产xxxxx| 国产成人无吗| 国产精品白浆视频免费观看| 国产天堂在线观看| 国产福利片在线| 一区免费观看| 蜜桃av在线免费观看| 天堂网中文在线| 蜜桃视频网站在线| 丁香综合五月| 国产第一页在线视频| 精品亚洲成a人片在线观看| 精品一区二区三区在线成人| 伊人免费在线| 国产在线观看网站| 五月亚洲综合| 97操碰视频| 九九热在线视频免费观看| 中文字幕在线免费观看| 国产porny蝌蚪视频| 亚洲综合色视频在线观看| 任你操视频在线观看| 国产在线精品一区二区不卡| 黄网在线免费| 国产成人精品实拍在线| 日本在线视频www鲁啊鲁| 超碰在线国产| 在线三级中文| 午夜视频在线观看网站午夜视频在线| 国产福利在线看| 久热中文字幕精品视频在线| 九九热视频免费在线观看| 国产日本韩国在线播放| а√最新版在线天堂| 国产精品视频一区二区久久| 亚洲精品视频区| 18加网站在线| 懂色一区二区三区| 精品入口蜜桃| 国产三区在线观看| 国产免费av在线| 日本黄色免费网址| 亚洲人在线播放| 精品入口蜜桃| 91在线网站| 精品亚洲综合| 精品中文字幕不卡在线视频| 中文av资源在线| 国产精品欧美韩国日本久久| 丁香花高清在线观看完整版| 四虎成人免费| eeuss影院www在线观看| 精品无人乱码| aaa大片在线观看| 在线中文字幕资源| av网址在线免费观看| 2018狠狠干| 国产馆av播放| 91久久精品国产性色| 国产精品第八页| 国产精品爱久久久久久久小说 | 日本福利在线观看| 一本久中文高清| 先锋影音av中文字幕| 香蕉视频网站在线播放| 四虎一区二区三区| 超碰在线观看免费版| 国产麻豆高清视频在线第一页| 国产69久久| 国产天堂在线观看| 91社区在线观看| 欧美色欧美亚洲另类二区精品| 天天操夜夜做| 国产精品亚洲第五区在线| 日韩av成人| 四虎a级欧美在线观看| 就爱干草视频| 国产精品入口麻豆免费看| 99福利在线| 最近中文字幕mv免费高清电影| 国产极品嫩模在线视频一区| eeuss影院www在线观看| 最近免费中文字幕大全免费第三页| 中文字幕在线永久在线视频| 永久免费不卡在线观看黄网站| 超碰人人在线| 精品电影在线| 欧美xxxxx性| 国产激情自拍视频| 国产免费网址| 日本亚洲精品| 91蜜桃在线视频| 国产精品偷乱一区二区三区| av高清在线| 国产精品二线| 天天操人人干| 久久久久久日本一区99| 在线看黄网址| 影音先锋中文字幕在线| 国产私人尤物无码不卡| 国产在线观看色| 欧美精品一区二区三区免费| 国产精品久久麻豆| 99热在线观看免费| 久久国产热视频| 日韩亚洲一区中文字幕| 99reav在线| 在线中文字幕第一页| 国产桃色电影在线播放| 午夜av在线播放| 最新中文字幕在线| 国产美女一区视频| 国产卡二和卡三的视频| 狠狠操五月天| 超碰免费在线播放| 九九在线免费视频| 丁香婷婷在线| 九色精品视频在线观看| 色悠久久久久综合网小说| 夜夜嗨yeyeh| 亚洲欧美日韩一区成人| 在线播放av网站| a级片国产精品自在拍在线播放| 精精国产xxxx视频在线中文版| 97国产在线| av在线不卡免费| 国产在线观看av| 国产青草视频在线观看视频| 国产精品剧情一区二区三区| 91精品国产91久久久久久青草| av网站在线播放| 黄色三级视频在线观看| 国产在线观看18| 国产美女福利在线观看| 国产经典av| 日本h视频在线观看| 麻豆网站在线免费观看| 中文字幕在线第一页| 国产黄色小视频| 四虎网站在线观看| 天堂在线亚洲| 在线观看的av网站| 成人精品一区二区三区免费| 国产精选一区二区三区不卡催乳| 国产福利片在线| 国内自拍视频在线观看| 国产成人高清精品| 女子免费在线观看视频www| 国产精品视频h| 久久综合精品视频| av网站大全在线观看| 国产娇喘精品一区二区三区图片| jlzzjlzz欧美大全|