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 );