MySQL優化_合併表和分區表

一、合併表和分區表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;

 

複合分區:

相關文章
相關標籤/搜索