天天看點

MySQL分區表最佳實踐

雲栖号資訊:【 點選檢視更多行業資訊

在這裡您可以找到不同行業的第一手的上雲資訊,還在等什麼,快來!

前言:

分區是一種表的設計模式,通俗地講表分區是将一大表,根據條件分割成若幹個小表。但是對于應用程式來講,分區的表和沒有分區的表是一樣的。換句話來講,分區對于應用是透明的,隻是資料庫對于資料的重新整理。本篇文章給大家帶來的内容是關于MySQL中分區表的介紹及使用場景,有需要的朋友可以參考一下,希望對你有所幫助。

1.分區的目的及分區類型

MySQL在建立表的時候可以通過使用PARTITION BY子句定義每個分區存放的資料。在執行查詢的時候,優化器根據分區定義過濾那些沒有我們需要的資料的分區,這樣查詢就可以無需掃描所有分區,隻需要查找包含需要資料的分區即可。

分區的另一個目的是将資料按照一個較粗的粒度分别存放在不同的表中。這樣做可以将相關的資料存放在一起,另外,當我們想要一次批量删除整個分區的資料也會變得很友善。

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

  • RANGE分區:最為常用,基于屬于一個給定連續區間的列值,把多行配置設定給分區。最常見的是基于時間字段。
  • LIST分區:LIST分區和RANGE分區類似,差別在于LIST是枚舉值清單的集合,RANGE是連續的區間值的集合。
  • HASH分區:基于使用者定義的表達式的傳回值來進行選擇的分區,該表達式使用将要插入到表中的這些行的列值進行計算。這個函數可以包含MySQL中有效的、産生非負整數值的任何表達式。
  • KEY分區:類似于按HASH分區,差別在于KEY分區隻支援計算一列或多列,且MySQL伺服器提供其自身的哈希函數。必須有一列或多列包含整數值。

上述四種分區類型中,RANGE分區即範圍分區是最常用的。RANGE分區的特點是多個分區的範圍要連續,但是不能重疊,預設情況下使用VALUES LESS THAN屬性,即每個分區不包括指定的那個值。

2.分區操作示例

本節内容以RANGE分區為例,介紹下分區表相關的操作。

MySQL分區表最佳實踐
MySQL分區表最佳實踐

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

MySQL分區表最佳實踐
MySQL分區表最佳實踐

3.分區注意事項及适用場景

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

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

從上面的介紹中可以看出,分區表适用于一些日志記錄表。這類表的特點是資料量大、并且有冷熱資料區分,可以按照時間次元來進行資料歸檔。這類表是比較适合使用分區表的,因為分區表可以對單獨的分區進行維護,對于資料歸檔更友善。

4.分區表為什麼不常用

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

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

總結:

本文較為詳細的介紹了MySQL分區相關内容,如果想使用分區表的話,建議提早做好規劃,在初始化的時候即建立分區表并制定維護計劃,使用得當還是比較友善的,特别是有曆史資料歸檔需求的表,使用分區表會使歸檔更友善。當然,關于分區表的内容還有很多,有興趣的同學可以找找官方文檔,官方文檔中有大量示例。

【雲栖号線上課堂】每天都有産品技術專家分享!

課程位址:

https://yqh.aliyun.com/live

立即加入社群,與專家面對面,及時了解課程最新動态!

【雲栖号線上課堂 社群】

https://c.tb.cn/F3.Z8gvnK

原文釋出時間:2020-05-29

本文作者:kun_jian

本文來自:“

掘金

”,了解相關資訊可以關注“掘金”