亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

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

 更新時間:2019年01月10日 10:22:03   作者:聽風。  
這篇文章主要給大家介紹了關于MySQL分區(qū)表的正確使用方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

MySQL分區(qū)表概述

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

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

1. 確認MySQL服務器是否支持分區(qū)表

命令:

show plugins;

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

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

HASH分區(qū)(HASH)

HASH分區(qū)的特點

  • 根據MOD(分區(qū)鍵,分區(qū)數)的值把數據行存儲到表的不同分區(qū)中
  • 數據可以平均的分布在各個分區(qū)中
  • HASH分區(qū)的鍵值必須是一個INT類型的值,或是通過函數可以轉為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ū)鍵(需要先轉換成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 # 存儲表原數據信息
customer_login_log.ibd # Innodb數據文件

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

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

演示

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

查詢

范圍分區(qū)(RANGE)

RANGE分區(qū)特點

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

如何建立RANGE分區(qū)

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

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

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

LIST分區(qū)

LIST分區(qū)的特點

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

如何建立LIST分區(qū)

如果插入一條login_type為10的數據行,則會報錯

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

業(yè)務場景

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

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

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

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

按年份分區(qū)存儲,所以用YEAR函數進行了轉化

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)
) 

插入并查詢數據

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

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

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

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

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

我們可以通過下面語句

增加分區(qū)

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

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

刪除分區(qū)

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

ALTER TABLE customer_login_log DROP PARTITION p0;

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

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

我們可能有另一種需求對數據進行歸檔

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

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

  • MySQL>=5.7
  • 結構相同
  • 歸檔到的數據表一定要是非分區(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;

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

將歸檔數據的存儲引擎改為歸檔引擎

最后我們將歸檔數據的存儲引擎改為歸檔引擎,命令為

ALTER TABLE customer_login_log ENGINE=ARCHIVE;

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

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

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

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

1.關于自動增長

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

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

2.關于主鍵

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

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

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

innodb的數據是主索引的一部分,附加索引保存的是主索引的值。

3.關于count()函數

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

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

4.全文索引

myisam支持 FULLTEXT類型的全文索引

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

5.delete from table

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

6.索引保存位置

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

innodb的索引和數據一起保存在表空間里。

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。

相關文章

  • window下mysql 8.0.15 winx64安裝配置方法圖文教程

    window下mysql 8.0.15 winx64安裝配置方法圖文教程

    這篇文章主要為大家詳細介紹了window下mysql 8.0.15 winx64安裝配置方法圖文教程,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-03-03
  • mysql重裝后出現亂碼設置為utf8可解決

    mysql重裝后出現亂碼設置為utf8可解決

    mysql重裝后出現亂碼解決辦法:只能在配置文件中將database 和 server 字符集 設置為utf8 ,否則不起作用,具體如下感興趣的朋友可以參考下哈,希望對大家有所幫助
    2013-07-07
  • mysql數據庫優(yōu)化必會的幾個參數中文解釋

    mysql數據庫優(yōu)化必會的幾個參數中文解釋

    對于自己配置mysql數據庫的朋友,需要注意的幾點,下面都是英文的解釋,比較易懂方便和我一樣需要優(yōu)化配置mysql的朋友
    2008-09-09
  • 一文詳解如何查看本地MySQL的安裝路徑

    一文詳解如何查看本地MySQL的安裝路徑

    本地安裝MySQL對于初學者或者開發(fā)人員來說是一項基礎技能,但在安裝過程中可能會遇到各種問題,這篇文章主要介紹了如何查看本地MySQL安裝路徑的相關資料,需要的朋友可以參考下
    2025-05-05
  • mysql decimal類型判斷是否為0

    mysql decimal類型判斷是否為0

    在MySQL中,DECIMAL是一種用于存儲精確小數的數據類型,本文主要介紹了mysql decimal類型判斷是否為0,具有一定的參考價值,感興趣的可以了解一下
    2024-02-02
  • 監(jiān)聽mysql表內容變化 mysql開啟binlog

    監(jiān)聽mysql表內容變化 mysql開啟binlog

    這篇文章主要給大家介紹了關于監(jiān)聽mysql表內容變化,mysql開啟binlog的相關資料,文中通過示例代碼介紹的非常詳細,對大家學習或者使用mysql具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧
    2019-08-08
  • 一文詳解MySQL?Join使用原理

    一文詳解MySQL?Join使用原理

    JOIN是一種非常常見的操作,用于將兩個或多個表中的數據合并到一個結果集中。MySQL支持多種JOIN類型,本文通過代碼示例詳細介紹了Join的使用優(yōu)化,有需要的小伙伴可以參考閱讀
    2023-04-04
  • Mysql數據庫中把varchar類型轉化為int類型的方法

    Mysql數據庫中把varchar類型轉化為int類型的方法

    這篇文章主要介紹了Mysql數據庫中把varchar類型轉化為int類型的方法的相關資料,非常不錯,具有參考借鑒價值,需要的朋友可以參考下
    2016-07-07
  • mysql 不等于 符號寫法

    mysql 不等于 符號寫法

    今天在寫sql語句的時候,想確認下mysql的不等于運算符是用什么符號表示的
    2013-08-08
  • mysql unique key在查詢中的使用與相關問題

    mysql unique key在查詢中的使用與相關問題

    今天小編就為大家分享一篇關于mysql unique key在查詢中的使用與相關問題,小編覺得內容挺不錯的,現在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2019-04-04

最新評論