一、合併表和分區表php
1.一、合併表:把多個結果相同的表合併成爲一個容器。sql
表類型:Myisam 存儲引擎:merge數據庫
合併:unionless
Create table packtable (數據庫設計
Id int not null primary key函數
) engine=merge union=(table1,table2)spa
存在的問題:有重複的行設計
臨時表(內存臨時表、磁盤臨時表):索引
使用場景:內存
有大量的數據表的關聯查詢;
可以在數據量大的表中篩選記錄;
處理數據只須要某一些符合條件的數據;
數據會被很快銷燬的場景。
使用臨時表:
在 select查詢中指定sql_small_result
Order by 使用了dinstinct
使用Join查詢的時候,若是group by的列不是第一個表的列
直接使用磁盤臨時表:
Text類型、blob類型;
Groupby、ditinct子句中大於512byte的列
Union、union all,select子句大於512byte的列
臨時表的配置:
Tmp_table-size 系統建立 max_heap_table_size 用戶建立的
怎麼避免臨時表:
建立索引:在group by、order by的列建立索引;
拆分列、text字段通常單獨放在另外一張表或者不放在查詢條件裏;
建立臨時表:
CREATE TEMPORARY TABLE test1 {
Id int(10) not null,
Username varchar(50)
}
注意:php腳本中建立臨時表,臨時表只對當前鏈接可見,腳本執行完畢,臨時表自動銷燬;
客戶端鏈接:須要關閉客戶端;
手動刪除臨時表:drop table test1;
問題1: 如何合併兩張表?
Union 自動去重 select * from test1 union select * from test2;
union all 不會去重,字段數量、類型必須相同
問題2:a表和b表合併(使用臨時表)?
CREATE TEMPORARY TABLE test1 {
Id int(10) not null,
Username varchar(50)
}
Insert into test1 select * from test1 union select * from test2;
=========================================
CREATE TEMPORARY TABLE test2 SELECT * from test1;
業務處理
問題3:a表和b表合併到c表,數據量大的狀況
A表、 B表數據插入臨時表;
在臨時表/中間表中建立聯合索引;
Create index union_a on test1 ( c1,c2,c3);
1.二、分區表(partition):建立分區表的每一個分區都是有索引的獨立表
目的:物理數據庫設計技術、讓某些特定的查詢減小響應時間
分區類型:水平分區、垂直分區
水平分區:
RANGE分區:連續的空間 range values less than
Create table test1 (
Id int(10) not null,
Score int(3),
) partition by range(score)(
partition p1 values less than(60),
partition p2 values less than(80),
partition p3 values less than maxvalue
);
Insert into test1 values(1,50);
Select count(*) from test1 where score <60;
LIST分區:定義和選擇是基於某一列的值是否屬於某一個集合。
Mysql>=5.5 集合的值支持非整型數據
Create table test1 (
Id int(10) not null,
Score int(3),
) partition by list(dept_no)(
partition p1 values in(3,8),
partition p2 values in(7),
);
HASH分區(只支持數值類型):
Create table test1 (
Id int(10) not null,
Score int(3),
Birthday date
) partition by hash(month(Birthday))
Partitions 12;
Mode(6,12) //6 哈希函數的取餘
線性hash分區: //2的冪運算
Create table test1 (
Id int(10) not null,
Score int(3),
Birthday date
) partition by linear hash( month(Birthday) )
V=POW(2,ceiling(LOG(2,num))); 計算N
Partitions 12;
線性HASH分區的好處:當數據量大於1000G的時候,對分區的增長、合併、拆分、刪除會變得更加快捷。
線性HASH分區的缺點:數據分佈不均勻。
KEY分區(只計算一列或者多列):支持除了text和blob之外的其餘類型
Create table test1 (
Id int(10) not null,
Score int(3),
Birthday date,
Course varchar(25)
) partition by key( course )
Partitions 5;
複合分區: