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数据的表分区一的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 线性表顺序表---逆置所有元素
- 下一篇: 菜鸟学数据库(四)——超键、候选键、主键