1. 程式人生 > >MySQL分表技術&分割槽技術

MySQL分表技術&分割槽技術

一、分表技術

1、說明

說明:當一張表資料巨大時,不管如何優化,查詢也會相當慢

解決:1-增加查詢快取,2-使用分表技術

2、實現分表的方法

水平分表:手動建立多張表,通過PHP演算法判斷實現讀寫

垂直分表:將表字段拆分到其他表中

3、水平分表

水平分表圖示:

原理:PHP演算法,使用者ID%表個數,根據餘數選擇對應的資料表。

4、垂直分表

說明:當一個表有很多列,查詢慢

解決:將表中欄位分為常用欄位和不常用欄位,分別存入兩個表中。

5、MySQL分表的弊端

弊端:水平分表或垂直分表,雖然可以加快查詢速度,但卻需要手動在應用層寫邏輯程式碼,比較麻煩,增加了程式碼複雜度。

解決:通過分割槽可以規避,由MySQL底層實現水平分表,我們在應用層還是寫原生SQL語句即可。

二、分割槽技術

1、分割槽語法

1. create table 表名名(

2. List item

3. )engine=儲存引擎 charset=編號

4. partition by 演算法名(欄位) partitions 數字;

2、MySQL四種分割槽演算法

求餘(主鍵欄位):key演算法、hash演算法

條件:list資料必須在指定集合中,range資料在執行範圍中

①key分割槽

1 #建立資料庫db

2 create database db;

3 #選擇資料庫

4 use db;

5 #建立表

6 create table articles(

7 id int unsigned primary key auto_increment,

8 title varchar(50) not null,

9 content text

10 ) engine = myisam charset = utf8

11 partition by key(id) partitions 3;

12 #通過key演算法求餘id欄位,分3個區

13

14 #插入測試資料

15 insert into articles values (null,‘aaa’,‘bbb’);

16

17 #重新整理檢視效果

18 flush table articles;

1 #查詢資料(原生SQL語句查詢)

2 select * from articles;

②hash 分割槽

1 #建立表

2 create table articles(

3 id int unsigned primary key auto_increment,

4 title varchar(50) not null,

5 content text

6 ) engine = myisam charset = utf8

7 partition by hash (id) partitions 4;

8 #插入資料

9 insert into articles values (null,‘aaa’,‘bb’);

10 #查詢資料

11 select * from articles;

③list分割槽

1 #建立表

2 create table articles(

3 id int unsigned auto_increment,

4 title varchar(50) not null,

5 content text,

6 cid int unsigned,

7 primary key (id,cid)

8 ) engine = myisam charset = utf8

9 partition by list(cid) (

10 partition c1 values in (1,3),

11 partition c2 values in (2,4),

12 partition c3 values in (5,6,7)

13 );

14 #插入資料

15 insert into articles values (null,‘aaa’,‘bb’, 1);

16 insert into articles values (null,‘aaa’,‘bb’, 10); //報錯,不存在10

④range分割槽

1 #建立資料表並實現range分割槽

2 create table user(

3 id int not null auto_increment,

4 name varchar(40) not null,

5 birthday date not null default ‘0000-00-00’,

6 primary key(id,birthday)

7 ) engine = myisam default charset = utf8

8 partition by range(year(birthday)) (

9 partition 70hou values less than (1980),

10 partition 80hou values less than (1990),

11 partition 90hou values less than (2000),

12 partition 00hou values less than (2010)

13 );

14 #插入資料

15 insert into user values (null,‘c’,‘1990-01-01’);

16 insert into user values (null,‘d’,‘2011-01-01’); //報錯,該分割槽不存在

3、分割槽管理

取餘管理:增加分割槽-不影響原資料,刪除分割槽-不影響原資料

條件管理:增加分割槽-不影響原資料,刪除分割槽-資料丟失

①取餘管理(key,hash)

增加分割槽數量:alter table 表名 add partition partitions 個數

減少分割槽數量:alter table 表名 coalesce partition 個數

②條件管理(list,range)

刪除分割槽:alter table 表名 drop partition 分割槽名;

新增分割槽:

1 alter table tp_user add partition(

2 partition 10hou values less than (maxvalue)

3 );

4

5 alter table tp_goods add partition(

6 partition c4 values in (8,9,10)

7 );