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

MySQL分區(qū)表的最佳實踐指南

 更新時間:2020年05月31日 11:35:18   作者:kunjian  
這篇文章主要給大家介紹了關于MySQL分區(qū)表的最佳實踐指南,文中通過示例代碼介紹的非常詳細,對大家學習或者使用MySQL具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧

前言:

分區(qū)是一種表的設計模式,通俗地講表分區(qū)是將一大表,根據條件分割成若干個小表。但是對于應用程序來講,分區(qū)的表和沒有分區(qū)的表是一樣的。換句話來講,分區(qū)對于應用是透明的,只是數據庫對于數據的重新整理。本篇文章給大家?guī)淼膬热菔顷P于MySQL中分區(qū)表的介紹及使用場景,有需要的朋友可以參考一下,希望對你有所幫助。

1.分區(qū)的目的及分區(qū)類型

MySQL在創(chuàng)建表的時候可以通過使用PARTITION BY子句定義每個分區(qū)存放的數據。在執(zhí)行查詢的時候,優(yōu)化器根據分區(qū)定義過濾那些沒有我們需要的數據的分區(qū),這樣查詢就可以無需掃描所有分區(qū),只需要查找包含需要數據的分區(qū)即可。

分區(qū)的另一個目的是將數據按照一個較粗的粒度分別存放在不同的表中。這樣做可以將相關的數據存放在一起,另外,當我們想要一次批量刪除整個分區(qū)的數據也會變得很方便。

下面簡單介紹下四種常見的分區(qū)類型:

  • RANGE分區(qū):最為常用,基于屬于一個給定連續(xù)區(qū)間的列值,把多行分配給分區(qū)。最常見的是基于時間字段。
  • LIST分區(qū):LIST分區(qū)和RANGE分區(qū)類似,區(qū)別在于LIST是枚舉值列表的集合,RANGE是連續(xù)的區(qū)間值的集合。
  • HASH分區(qū):基于用戶定義的表達式的返回值來進行選擇的分區(qū),該表達式使用將要插入到表中的這些行的列值進行計算。這個函數可以包含MySQL中有效的、產生非負整數值的任何表達式。
  • KEY分區(qū):類似于按HASH分區(qū),區(qū)別在于KEY分區(qū)只支持計算一列或多列,且MySQL服務器提供其自身的哈希函數。必須有一列或多列包含整數值。

上述四種分區(qū)類型中,RANGE分區(qū)即范圍分區(qū)是最常用的。RANGE分區(qū)的特點是多個分區(qū)的范圍要連續(xù),但是不能重疊,默認情況下使用VALUES LESS THAN屬性,即每個分區(qū)不包括指定的那個值。

2.分區(qū)操作示例

本節(jié)內容以RANGE分區(qū)為例,介紹下分區(qū)表相關的操作。

# 創(chuàng)建分區(qū)表
mysql> CREATE TABLE `tr` (
 -> `id` INT, 
 -> `name` VARCHAR(50), 
 -> `purchased` DATE
 -> ) ENGINE=InnoDB DEFAULT CHARSET=utf8
 -> PARTITION BY RANGE( YEAR(purchased) ) (
 -> PARTITION p0 VALUES LESS THAN (1990),
 -> PARTITION p1 VALUES LESS THAN (1995),
 -> PARTITION p2 VALUES LESS THAN (2000),
 -> PARTITION p3 VALUES LESS THAN (2005),
 -> PARTITION p4 VALUES LESS THAN (2010),
 -> PARTITION p5 VALUES LESS THAN (2015)
 -> );
Query OK, 0 rows affected (0.28 sec)

# 插入數據
mysql> INSERT INTO `tr` VALUES
 ->  (1, 'desk organiser', '2003-10-15'),
 ->  (2, 'alarm clock', '1997-11-05'),
 ->  (3, 'chair', '2009-03-10'),
 ->  (4, 'bookcase', '1989-01-10'),
 ->  (5, 'exercise bike', '2014-05-09'),
 ->  (6, 'sofa', '1987-06-05'),
 ->  (7, 'espresso maker', '2011-11-22'),
 ->  (8, 'aquarium', '1992-08-04'),
 ->  (9, 'study desk', '2006-09-16'),
 ->  (10, 'lava lamp', '1998-12-25');
Query OK, 10 rows affected (0.03 sec)
Records: 10 Duplicates: 0 Warnings: 0

創(chuàng)建后可以看到,每個分區(qū)都會對應1個ibd文件。上面創(chuàng)建語句還是很好理解的,在此分區(qū)表中,通過YEAR函數取出DATE日期中的年份并轉化為整型,年份小于1990的存儲在分區(qū)p0中,小于1995的存儲在分區(qū)p1中,以此類推。請注意,每個分區(qū)的定義順序是從最低到最高。為了防止插入的數據因找不到相應分區(qū)而報錯,我們應該及時創(chuàng)建新的分區(qū)。下面繼續(xù)展示關于分區(qū)維護的其他操作。

# 查看某個分區(qū)的數據
mysql> SELECT * FROM tr PARTITION (p2);
+------+-------------+------------+
| id | name  | purchased |
+------+-------------+------------+
| 2 | alarm clock | 1997-11-05 |
| 10 | lava lamp | 1998-12-25 |
+------+-------------+------------+
2 rows in set (0.00 sec)

# 增加分區(qū)
mysql> alter table tr add partition(
 -> PARTITION p6 VALUES LESS THAN (2020)
 -> );
Query OK, 0 rows affected (0.06 sec)
Records: 0 Duplicates: 0 Warnings: 0

# 拆分分區(qū)
mysql> alter table tr reorganize partition p5 into(
 -> partition s0 values less than(2012),
 -> partition s1 values less than(2015)
 -> );
Query OK, 0 rows affected (0.26 sec)
Records: 0 Duplicates: 0 Warnings: 0

# 合并分區(qū)
mysql> alter table tr reorganize partition s0,s1 into ( 
 ->  partition p5 values less than (2015) 
 -> );
Query OK, 0 rows affected (0.12 sec)
Records: 0 Duplicates: 0 Warnings: 0

# 清空某分區(qū)的數據
mysql> alter table tr truncate partition p0;
Query OK, 0 rows affected (0.11 sec)

# 刪除分區(qū)
mysql> alter table tr drop partition p1;
Query OK, 0 rows affected (0.06 sec)
Records: 0 Duplicates: 0 Warnings: 0

# 交換分區(qū)
# 先創(chuàng)建與分區(qū)表同樣結構的交換表
mysql> CREATE TABLE `tr_archive` (
 -> `id` INT, 
 -> `name` VARCHAR(50), 
 -> `purchased` DATE
 -> ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
Query OK, 0 rows affected (0.28 sec)
# 執(zhí)行exchange交換分區(qū) 
mysql> alter table tr exchange PARTITION p2 with table tr_archive;
Query OK, 0 rows affected (0.13 sec) 

3.分區(qū)注意事項及適用場景

其實分區(qū)表的使用有很多限制和需要注意的事項,參考官方文檔,簡要總結幾點如下:

  • 分區(qū)字段必須是整數類型或解析為整數的表達式。
  • 分區(qū)字段建議設置為NOT NULL,若某行數據分區(qū)字段為null,在RANGE分區(qū)中,該行數據會劃分到最小的分區(qū)里。
  • MySQL分區(qū)中如果存在主鍵或唯一鍵,則分區(qū)列必須包含在其中。
  • Innodb分區(qū)表不支持外鍵。
  • 更改sql_mode模式可能影響分區(qū)表的表現。
  • 分區(qū)表不影響自增列。

從上面的介紹中可以看出,分區(qū)表適用于一些日志記錄表。這類表的特點是數據量大、并且有冷熱數據區(qū)分,可以按照時間維度來進行數據歸檔。這類表是比較適合使用分區(qū)表的,因為分區(qū)表可以對單獨的分區(qū)進行維護,對于數據歸檔更方便。

4.分區(qū)表為什么不常用

在我們項目開發(fā)中,分區(qū)表其實是很少用的,下面簡單說明下幾點原因:

  • 分區(qū)字段的選擇有限制。
  • 若查詢不走分區(qū)鍵,則可能會掃描所有分區(qū),效率不會提升。
  • 若數據分布不均,分區(qū)大小差別較大,可能性能提升也有限。
  • 普通表改造成分區(qū)表比較繁瑣。
  • 需要持續(xù)對分區(qū)進行維護,比如到了6月份前就要新增6月份的分區(qū)。
  • 增加學習成本,存在未知風險。

總結:

本文較為詳細的介紹了MySQL分區(qū)相關內容,如果想使用分區(qū)表的話,建議提早做好規(guī)劃,在初始化的時候即創(chuàng)建分區(qū)表并制定維護計劃,使用得當還是比較方便的,特別是有歷史數據歸檔需求的表,使用分區(qū)表會使歸檔更方便。當然,關于分區(qū)表的內容還有很多,有興趣的同學可以找找官方文檔,官方文檔中有大量示例。

參考:

https://dev.mysql.com/doc/refman/5.7/en/partitioning.html

http://chabaoo.cn/article/187690.htm

好了,到此這篇關于MySQL分區(qū)表的最佳實踐指南的文章就介紹到這了,更多相關MySQL分區(qū)表實踐內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • MySQL5.7 JSON類型使用詳解

    MySQL5.7 JSON類型使用詳解

    MySQL5.7發(fā)布后,專門設計了JSON數據類型以及關于這種類型的檢索以及其他函數解析。 我們先看看MySQL老版本的JSON存取方式,具體內容詳情大家參考下本文吧
    2017-10-10
  • 解決windows service 2012阿里云服務器在搭建mysql時缺少msvcr100.dll文件的問題

    解決windows service 2012阿里云服務器在搭建mysql時缺少msvcr100.dll文件的問題

    這篇文章主要介紹了解決windows service 2012阿里云服務器在搭建mysql時缺少msvcr100.dll文件的問題,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-02-02
  • mysql數據庫忘記管理員密碼的解決方法

    mysql數據庫忘記管理員密碼的解決方法

    我們在Windows操作系統下編程會使用到MySQL數據庫。但是有時,我們會忘記數據庫的登錄密碼?當我們忘記了登錄密碼,無法進入mysql時,該怎么辦呢?這里我們提供mysql的登錄秘密的修改
    2018-02-02
  • MySQL的Grant命令詳解

    MySQL的Grant命令詳解

    mysql中可以通過Grant命令為數據庫賦予用戶權限,這里簡單介紹下Grant的使用方法,需要的朋友可以參考下
    2013-10-10
  • Mysql 索引結構直觀圖解介紹

    Mysql 索引結構直觀圖解介紹

    Mysql-索引結構直觀圖解。上一篇剛剛通俗化的說明了B-TREE的幾個結果與存儲方式,其實跟索引感覺上還是沒有關聯起來, 那么本篇,就通過實際的一個數據行的例子,說明一下
    2016-12-12
  • 淺談MySQL臨時表與派生表

    淺談MySQL臨時表與派生表

    MySQL在處理請求的某些場景中,服務器創(chuàng)建內部臨時表。即表以MEMORY引擎在內存中處理,或以MyISAM引擎儲存在磁盤上處理.如果表過大,服務器可能會把內存中的臨時表轉存在磁盤上。
    2017-02-02
  • MySQL觸發(fā)器 Update觸發(fā)Insert失敗

    MySQL觸發(fā)器 Update觸發(fā)Insert失敗

    這篇文章主要介紹了MySQL觸發(fā)器 Update觸發(fā)Insert失敗 的相關資料,非常不錯,具有參考借鑒價值,需要的朋友可以參考下
    2016-07-07
  • Mysql將一個表中的某一列數據復制到另一個表中某一列里的方法

    Mysql將一個表中的某一列數據復制到另一個表中某一列里的方法

    今天小編就為大家分享一篇關于Mysql將一個表中的某一列數據復制到另一個表中某一列里的方法,小編覺得內容挺不錯的,現在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2019-03-03
  • 關于SQL語句中的AND和OR執(zhí)行順序遇到的問題

    關于SQL語句中的AND和OR執(zhí)行順序遇到的問題

    在SQL語句中的AND和OR執(zhí)行順序中我們經常會遇到一些問題,下面有簡單的解決方法,小編來和大家一起來看看
    2019-05-05
  • mysql 創(chuàng)建root用戶和普通用戶及修改刪除功能

    mysql 創(chuàng)建root用戶和普通用戶及修改刪除功能

    這篇文章主要介紹了mysql 創(chuàng)建root用戶和普通用戶及修改刪除功能,需要的朋友可以參考下
    2017-05-05

最新評論