mysql的分區跟分表

2021-01-08 毛橘教你學編程

mysql的分區和分表

分區

分區就是把一個數據表的文件和索引分散存儲在不同的物理文件中。

mysql支持的分區類型包括Range、List、Hash、Key,其中Range比較常用:

RANGE分區:基於屬於一個給定連續區間的列值,把多行分配給分區。

LIST分區:類似於按RANGE分區,區別在於LIST分區是基於列值匹配一個離散值集合中的某個值來進行選擇。

HASH分區:基於用戶定義的表達式的返回值來進行選擇的分區,該表達式使用將要插入到表中的這些行的列值進行計算。這個函數可以包含MySQL 中有效的、產生非負整數值的任何表達式。

KEY分區:類似於按HASH分區,區別在於KEY分區只支持計算一列或多列,且MySQL伺服器提供其自身的哈希函數。必須有一列或多列包含整數值。

案例:

建立一個user 表 以id進行分區 id 小於10的在user_1分區id小於20的在user_2分區

create table user(

id int not null auto_increment,

username varchar(10),

primary key(id)

)engine = innodb charset=utf8

partition by range (id)(

partition user_1 values less than (10),

partition user_2 values less than (20)

);

建立後添加分區:

maxvalue 表示最大值 這樣大於等於20的id 都出存儲在user_3分區

alter table user add partition(

partition user_3 values less than maxvalue

);

刪除分區:

alter table user drop partition user_3;

現在打開mysql的數據目錄

可以看見多了user#P#user_1.ibd 和user#P#user_2.ibd 這兩個文件

如果表使用的存儲引擎是MyISAM類型,就是:

user#P#user_1.MYD,user#P#user_1.MYI和user#P#user_2.MYD,user#P#user_2.MYI

分區模式詳解:

* Range(範圍) – 這種模式允許DBA將數據劃分不同範圍。例如DBA可以將一個表通過年份劃分成三個分區,80年代(1980's)的數據,90年代(1990's)的數據以及任何在2000年(包括2000年)後的數據。

CREATE TABLE users (

id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,

usersname VARCHAR(30) NOT NULL DEFAULT '',

email VARCHAR(30) NOT NULL DEFAULT ''

)

PARTITION BY RANGE (id) (

PARTITION p0 VALUES LESS THAN (3000000),

PARTITION p1 VALUES LESS THAN (6000000),

PARTITION p2 VALUES LESS THAN (9000000),

PARTITION p3 VALUES LESS THAN MAXVALUE

);

在這裡,將用戶表分成4個分區,以每300萬條記錄為界限,每個分區都有自己獨立的數據、索引文件的存放目錄。

還可以將這些分區所在的物理磁碟分開完全獨立,可以提高磁碟IO吞吐量。

如果你也想成為程式設計師,想要快速掌握編程,趕緊關注小編加入學習企鵝圈子吧!

裡面有資深專業軟體開發工程師,在線解答你的所有疑惑~程式語言入門「so easy」

資料包含:編程入門、遊戲編程、課程設計等。

免費學習書籍:

免費學習資料:

CREATE TABLE users (

id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,

usersname VARCHAR(30) NOT NULL DEFAULT '',

email VARCHAR(30) NOT NULL DEFAULT ''

)

PARTITION BY RANGE (id) (

PARTITION p0 VALUES LESS THAN (3000000)

DATA DIRECTORY = '/data0/data'

INDEX DIRECTORY = '/data0/index',

PARTITION p1 VALUES LESS THAN (6000000)

DATA DIRECTORY = '/data1/data'

INDEX DIRECTORY = '/data1/index',

PARTITION p2 VALUES LESS THAN (9000000)

DATA DIRECTORY = '/data2/data'

INDEX DIRECTORY = '/data2/index',

PARTITION p3 VALUES LESS THAN MAXVALUE

DATA DIRECTORY = '/data3/data'

INDEX DIRECTORY = '/data3/index'

);

* List(預定義列表) – 這種模式允許系統通過DBA定義的列表的值所對應的行數據進行分割。例如:DBA根據用戶的類型進行分區。

CREATE TABLE user (

id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,

name VARCHAR(30) NOT NULL DEFAULT '' ,

user_type int not null

)

PARTITION BY LIST (user_type ) (

PARTITION p0 VALUES IN (0,4,8,12) ,

PARTITION p1 VALUES IN (1,5,9,13) ,

PARTITION p2 VALUES IN (2,6,10,14),

PARTITION p3 VALUES IN (3,7,11,15)

);

分成4個區,同樣可以將分區設置的獨立的磁碟中。

* Key(鍵值)

CREATE TABLE user (

id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,

name VARCHAR(30) NOT NULL DEFAULT '',

email VARCHAR(30) NOT NULL DEFAULT ''

)

PARTITION BY KEY (id) PARTITIONS 4 (

PARTITION p0,

PARTITION p1,

PARTITION p2,

PARTITION p3

);

* Hash(哈希)

CREATE TABLE user (

id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,

username VARCHAR(30) NOT NULL DEFAULT '',

email VARCHAR(30) NOT NULL DEFAULT ''

)

PARTITION BY HASH (id) PARTITIONS 4 (

PARTITION p0 ,

PARTITION p1,

PARTITION p2,

PARTITION p3

);

分表

分表和分區類似,區別是,分區是把一個邏輯表文件分成幾個物理文件後進行存儲,而分表則是把原先的一個表分成幾個表。進行分表查詢時可以通過union或者視圖。

分表又分垂直分割和水平分割,其中水平分分割最為常用。水平分割通常是指切分到另外一個資料庫或表中。例如對於一個會員表,按對3的模進行分割:

table = id%3

如果id%3 = 0 則將用戶數據放入到user_0表中,如id%3=1就放入user_1表中,依次類推。

在這裡有個問題,這個uid應該是所有會員按序增長的,可他是怎麼得到的呢?使用auto_increment是不行的,這樣就用到序列了。

對於一些流量統計系統,其數據量比較大,並且對過往數據的關注度不高,這時按年、月、日進行分表,將每日統計信息放到一個以日期命名的表中;或者按照增量進行分表,如每個表100萬數據,超過100萬就放入第二個表。還可以按Hash進行分表,但是按日期和取模餘數分表最為常見,也容易擴展。

分表後可能會遇到新的問題,那就是查詢,分頁和統計。通用的方法是在程序中進行處理,輔助視圖。

相關焦點

  • Mysql數據分片技術(一)——初識表分區
    mysql小型資料庫瓶頸網際網路行業企業都傾向於mysql資料庫,雖說mysql單表能支持億級別的數據量,加上索引優化下查詢速度,勉強能使用,但是對於追求性能和效率的網際網路企業,這是遠遠不夠的。Mysql資料庫單表數據量到達500萬左右,達到性能最佳點,可是對於需要億級別的業務來說,500萬是遠遠不夠的。既然數據放在一個位置不行,那我們就把數據拆分放到多個位置。如果尋找數據位置的時間成本忽略不計的話,那麼在億級別的數據量裡面查詢數據的時間成本就相當於從單張表力查詢數據的時間成本一樣。這就是分庫分表的最初思想。
  • 良心文章|MySQL性能優化分區之實戰(最全面最完整的分區)
    在where子句中包含分區條件時,可以只掃描必要的一個或者多個分區來提高查詢效率;同時在涉及sum()和count()這類聚合函數的查詢時,可以容易的在每個分區上並行處理,最終只需要匯總所有分區得到的結果對於已經過期或者不需要保存的數據,可以通過刪除與這些數據有關的分區來快速刪除數據跨多個磁碟來分散數據查詢,以獲得更大的查詢吞吐量分區和水平分表功能類似,將一個大表的數據分割到多張小表中去,由於查詢不需要全表掃描了
  • 三種 MySQL 大表優化方案
    該過程心中慰問跑路的那幾個開發者一萬遍 :)方案一詳細說明:優化現有mysql資料庫跟阿里雲資料庫大佬電話溝通 and Google解決方案 and 問群裡大佬,總結如下(都是精華):1.資料庫設計和表創建時就要考慮性能
  • mysql優化之分區
    mysql分區類型日常開發中我們經常會遇到大表的情況,所謂的大表是指存儲了百萬級乃至千萬級條記錄的表。這樣的表過於龐大,導致資料庫在查詢和插入的時候耗時太長,性能低下,如果涉及聯合查詢的情況,性能會更加糟糕。分表和表分區的目的就是減少資料庫的負擔,提高資料庫的效率,通常點來講就是提高表的增刪改查效率。
  • 你們要的MyCat實現MySQL分庫分表來了
    前言在之前寫過一篇關於mysql分庫分表的文章,那篇文章只是給大家提供了一個思路,但是回復下面有很多說是細節問題沒有提到。本文只是針對其中的一個細節而已,比如如何落地MySQL的分庫分表,本文使用資料庫中間件MyCat來實現。其中還有最多的回覆是分庫分表後的分頁查詢如何操作,這個問題也會在後文繼續寫到。關於MySQL分庫分表這個真正落地使用中間還有很多的問題,咔咔儘量把解決方案都提供給大家,如你有更好的實現方案,評論區見哈!
  • Mysql 學習筆記:分庫分表 (sharding)
    拆分分為邏輯和物理拆分,邏輯拆分是對物理上不可分割的實例進行邏輯上的分割,物理拆分是拆分成多個獨立的實例:邏輯拆分分區(Partition)分表物理拆分讀寫分離垂直拆分(分庫)水平拆分(分表):需要把表遍歷,1000W條數據,查詢性能就不用說了;分區:按照年份分區,當要查詢15年數據,只會遍歷15年的數據200W條,加快了查詢;1.2 分表當單表數據行數超過一定量級時,讀/寫 會變慢,查詢需要檢索更多數據,DML操作需要更多時間創建/更新索引;我們可以通過把這些數據分散到多個表中來提高效率
  • 資料庫分區操作命令及注意事項
    今天和同事討論資料庫大表怎麼拆分,他提出了分區的概念,幹了這麼久的我竟然對分區不了解,於是趕緊查資料才弄懂分區是怎麼一回事。之前的我一直以為分區和分表說的是一回事,真是很傻很天真。為什麼要分表和分區?我們的資料庫數據越來越大,隨之而來的是單個表中數據太多。
  • 基於MYSQL資料庫實現自動創建分區
    概述Mysql不能自動創建分區,需要使用mysql event事件的方式自動創建分區,今天主要分享一下在MYSQL資料庫應如何實現自動創建分區。1、準備測試表及數據CREATE TABLE `t1` ( `id` bigint(20) NOT NULL COMMENT &39;, `insert_user` varchar(128) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL
  • mysql資料庫優化方案之分庫分表,輕鬆解決億級數據問題
    今天介紹下sharding-sphere,主要介紹他的特性,分庫分表的技術的詳解。這次圍繞上次分庫分表,繼續說下shardingShpere是如何做到的代碼層面是如何實現的。分庫分表寫入的都是邏輯表,很多語句都是要進行改寫的。
  • MySQL數據量太大,日常卡死!想跑路了
    該過程心中慰問跑路的那幾個開發者一萬遍 :)方案一詳細說明:優化現有mysql資料庫跟阿里雲資料庫大佬電話溝通 and Google解決方案 and 問群裡大佬,總結如下(都是精華):1.資料庫設計和表創建時就要考慮性能 2.sql的編寫需要注意優化
  • mycat 安裝 分表 分庫 讀寫分離
    就像正常的單表一樣。 mycat 來管理 數據切片,主從,分布式事務問題。 實測 navicat formysql 11.0.9 可以連接mysql。 上面的這種 相當於 根據枚舉值決定分到哪個分區和 直接使用mysql 一樣。
  • 初中級必須知道的MYSQL經典面試題
    在我們平時面試過程中,那些mysql面試題是經常被問到的呢?你有哪些問題是不會的呢?趁熱打鐵趕緊鞏固一下mysql的知識吧1.mysql事務的基本特徵和事務隔離級別四大特性:原子性,一致性,隔離性,持久性;隔離級別:讀未提交,不可以重複讀,可重複讀,串行化。
  • MySQL分區表最佳實踐
    前言:分區是一種表的設計模式,通俗地講表分區是將一大表,根據條件分割成若干個小表。但是對於應用程式來講,分區的表和沒有分區的表是一樣的。換句話來講,分區對於應用是透明的,只是資料庫對於數據的重新整理。本篇文章給大家帶來的內容是關於MySQL中分區表的介紹及使用場景,有需要的朋友可以參考一下,希望對你有所幫助。
  • MySQL存儲引擎的物理結構與表空間
    此時就使用到了表空間,表空間這個名詞是來自於Oracle資料庫。Oracle就是將資料庫中的數據存儲到表空間(Tablespace),而在表空間內存,會分配數據存儲到sdb1,sdc1等磁碟分區位置上,也就是說磁碟空間的增加對於資料庫服務而言是透明的,是不可感知的而對於MySQL到了5.5這個版本,已經被Oracle收購了。就將表空間的概念引入到MySQL中,MySQL也具備了表空間的管理模式。
  • sybase資料庫分區介紹
    分區就是為了解決以上問題。第2章 參考<<Sybase Adaptive Server Enterprise 15數據分區>> 第3章 分區介紹 分區有2個概念1 資料庫分區2 表分區由於實際應用中表分區應用的比較多,我們在此只對表分區進行介紹,對於資料庫分區不做介紹。
  • Mysql update多表聯合更新的方法小結
    知識點補充:  mysql多表關聯update  日常的開發中一般都是寫的單表update語句,很少寫多表關聯的update。  不同於sql server,在mysql中,update的多表連接更新和select的多表連接查詢在使用的方法上存在一些小差異。  來看一個具體的例子。
  • 使用sqoop在MySQL、hadoop、hive間同步數據
    --target-dir後還可以跟cos路徑,直接導出到cos中,同樣的,如果cos中的目錄已經存在也會報錯。\--connect jdbc:mysql://$mysqlIP/test \--username root \-P --table sqoop_test \-m 4 \--export-dir /sqoop \--input-fields-terminated-by '\t'同上,--export-dir也支持跟cos路徑。
  • 選擇pgsql還是mysql?
    概述:mysql出現在1994年,現在所有權歸屬oracle,創始人現在又發布了新的免費開源資料庫MariaDB,現在開源關係型資料庫領域,mysql使用確實是最廣泛的,官方說許多世界上最大、發展最快的組織都在使用mysql。
  • MySQL高級部分理論知識細講
    分區並不是生成新的資料庫表,而是將表的數據均勻分攤到不同的硬碟,系統或不同伺服器存儲介子中,實際上還是一張表。所有在表中定義的列在每個數據集中都能找到,所以表的特性得以保持。舉例:一個包含十年發票記錄的表可以被分區為10個不同的分區,每個分區包含的是其中一年的記錄。
  • MySQL常用優化指南,及大表優化思路(值得收藏)
    分區的類型:RANGE 分區:基於屬於一個給定連續區間的列值,把多行分配給分區LIST 分區:類似於按 RANGE 分區,區別在於 LIST 分區是基於列值匹配一個離散值集合中的某個值來進行選擇HASH 分區:基於用戶定義的表達式的返回值來進行選擇的分區,該表達式使用將要插入到表中的這些行的列值進行計算