日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

mysql数据的表分区一

發布時間:2023/12/19 数据库 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 mysql数据的表分区一 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

當mysql中醫個表的總記錄數超過了1000W,會出現性能大幅度下降的情況,單性能下降的比率由系統的架構、應用程序、數據庫索引、服務器硬件等多種因素而定。數據庫多達上億的數據量,分表之后的單個表 也已經超過了千萬,那么單個表的更新等均影響著系統的運行效率。甚至是以條簡單的sql都有可能壓垮整個數據庫,如整個表對某個字段的排序操作等。

我們針對海量數據的優化主要有兩種方法:達標拆小表的方式,sql語句的優化

sql語句的優化:可以通過增加索引等來調整,但是數據量的增大會導致索引的維護帶價增大。

大表拆小表,一般分有 垂直分割 和 水平分割 兩種,一般我們對大的數據表進行分割的情況下使用的是水平分割,為了防止冗余,而且要求字段比較少,所以采用水平分割。

?

從mysql5.1以后的版本里面增加了一個技術,是以插件的方式加入到mysql中。就是分區技術

分區技術可以解決,硬件上比較大的表帶來的影響,邏輯上表名不變。

目前分區技術 有4種分區類型:

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

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

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

KEY分區:類似于按HASH分區,區別在于KEY分區只支持計算一列或多列,且mysql服務器提供其自身的哈希函數。

例子:假定了一個如下的表,該表保存了有20家店的志愿記錄,這20加店的標號從1-20.如果你想將其分成4個小分區,那么可以采用RANGE分區,創建的數據庫表如下:

mysql>create table employees(

->? id INT NOT NULL,??????? //這是一個ID,××× 不能為空

->? fname VARCHAR(30),???// 這是 第一個名字 varchar類型

->? lname VARCHAR(30),?

->? hired DATE NOT NULL DEFAULT '1970-01-01',? //這是入職時間 時間類型 不能為空

->? separated DATE NOT NULL DEFAULT '9999-12-12',? //這是離職時間 和入職一樣

->? job_code INT NOT NULL,??? //這是 員工的編號 ×××,不能為空

->? store_id INT NOT NULL?? //這是店的編號,×××,不能為空

->? )

->? PARTITION BY RANGE(store_id)(? //這里是用RANGE分區的店的編號進行分區

->? PARTITION p0 VALUES LESS THAN(6),?? //6號店之前的分到 p0 分區里面

->? PARTITION p1 VALUES LESS THAN(11), //下面就不用解釋了 就是分到不同的區

->? PARTITION p2 VALUES LESS THAN(16),

->? PARTITION p3 VALUES LESS THAN(21)

->? );

上面的例子 是按照店編號來進行分區,還有我們的用戶 或者員工非常多,有上萬,那么我們也可以按照他們不同的入職時間來進行分區,也就是按照時間來分區,例子如下:

mysql>create table employees(

->? id INT NOT NULL,??????? //這是一個ID,××× 不能為空

->? fname VARCHAR(30),???// 這是 第一個名字 varchar類型

->? lname VARCHAR(30),?

->? hired DATE NOT NULL DEFAULT '1970-01-01',? //這是入職時間 時間類型 不能為空

->? separated DATE NOT NULL DEFAULT '9999-12-12',? //這是離職時間 和入職一樣

->? job_code INT NOT NULL,??? //這是 員工的編號 ×××,不能為空

->? store_id INT NOT NULL?? //這是店的編號,×××,不能為空

->? )

->? PARTITION BY RANGE(YEAR(hired))(? //這里是用year函數來計算出入職的年???????????????????

->? PARTITION p0 VALUES LESS THAN(1991),?? //1991年之前的分到 p0 分區里面

->? PARTITION p1 VALUES LESS THAN(2001), //下面就不用解釋了 就是分到不同的區

->? PARTITION p2 VALUES LESS THAN(2011),

->? PARTITION p3 VALUES LESS THAN MAXVALUE //如以上無法匹配 剩余的存放一個表里

->? );

下面這張圖是剛剛分區所形成的表的文件:

來解釋一下:

分區后 總共生成了10個文件,這10個文件分別是:

employees.frm 是表的結構

employees.par 是分區表

employees#P#p0.MYD? 是表的索引的文件

employees#P#p0.MYI?? 是表的數據的文件

一個大的表 拆分 成多個小的表 可以極大的降低 對操作系統的影響,減少資源浪費

轉載于:https://blog.51cto.com/yanzhe/1188848

創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎

總結

以上是生活随笔為你收集整理的mysql数据的表分区一的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。