天天看點

mysql 臨時表、記憶體表和視圖

虛拟表,顧名思義,就是實際上并不存在(實體上不存在),但是邏輯上存在的表。這樣說很抽象,還是看一些實際的例子吧。

一、mysql臨時表

1、什麼是臨時表

臨時表是建立在系統臨時檔案夾中的表,如果使用得當,完全可以像普通表一樣進行各種操作。 臨時表的資料和表結構都儲存在記憶體之中,退出時,其所占的空間會自動被釋放。

2、建立臨時表

(1)定義字段

create temporary table tmp_table (        

name varchar(10) not null,        

value integer not null)     

(2)直接将查詢結果導入臨時表

create temporary table tmp_table select * from table_name

3、查詢臨時表

select * from tmp_table

4、删除臨時表

drop table tmp_table

二、臨時表的應用

當工作在十分大的表上運作時,在實際操作中你可能會需要運作很多的相關查詢,來獲的一個大量資料的小的子集。較好的辦法,不是對整個表運作這些查詢,而是讓mysql每次找出所需的少數記錄,将記錄選擇到一個臨時表,然後對這些表運作查詢。

1)、當某一個sql語句關聯的表在2張及以上,并且和一些小表關聯。可以采用将大表進行分拆并且得到比較小的結果集合存放在臨時表中。

2)、程式執行過程中可能需要存放一些臨時的資料,這些資料在整個程式的會話過程中都需要用的等等。

3)、臨時表預設的是myisam,但是可以修改。

三、臨時表使用注意事項:

(1)臨時表隻在目前連接配接可見,當這個連接配接關閉的時候,會自動drop。這就意味着你可以在兩個不同的連接配接裡使用相同的臨時表名,并且互相不會 沖突,或者使用 已經存在的表,但不是臨時表的表名。(當這個臨時表存在的時候,存在的表被隐藏了,如果臨時表被drop,存在的表就可見了)。

(2) 臨時表隻能用在 memory,myisam,merge,或者innodb引擎。

3)臨時表不支援mysql cluster(簇)。

4)在同一個query語句中,你隻能查找一次臨時表。例如:下面的就不可用

  mysql> select * from temp_table, temp_table as t2;

  error 1137: can't reopen table: 'temp_table'

  如果在一個存儲函數裡,你用不同的别名查找一個臨時表多次,或者在這個存儲函數裡用不同的語句查找,這個錯誤都會發生。

5)show tables 語句不會列舉臨時表,但是會列出記憶體表。

6)你不能用rename來重命名一個臨時表。但是,你可以alter table代替:

  mysql>alter table orig_name rename new_name;

四、記憶體表

1、記憶體表:表結建構在磁盤裡,資料在記憶體裡 ,當停止服務後,表中的資料丢失,而表的結構不會丢失。記憶體表也可以被看作是臨時表的一種。

2、記憶體表的建立:

create temporary table tmp_table (

name varchar(10) not null,       

value integer not null 

)  type = heap  注意: type = heap必須要有。

五、記憶體表的應用

記憶體表使用哈希散列索引把資料儲存在記憶體中,是以具有極快的速度,适合緩存中小型資料庫。

1、heap對所有使用者的連接配接是可見的,這使得它非常适合做緩存。

2、一旦伺服器重新開機,所有heap表資料丢失,但是heap表結構仍然存在,因為heap表結構是存放在實際資料庫路徑下的,不會自動删除。重新開機之後,heap将被清空,這時候對heap的查詢結果都是空的。

3、如果heap是複制的某資料表(建立普通使用者表這些也會丢失),則複制之後所有主鍵、索引、自增等格式将不複存在,需要重新添加主鍵和索引,如果需要的話。

4、對于重新開機造成的資料丢失,有以下的解決辦法:

 a、在任何查詢之前,執行一次簡單的查詢,判斷heap表是否存在資料,如果不存在,則把資料重新寫入,或者drop表重新複制某張表。這需要多做一次查詢。不過可以寫成include檔案,在需要用該heap表的頁面随時調用,比較友善。

 b、對于需要該heap表的頁面,在該頁面第一次且僅在第一次查詢該表時,對資料集結果進行判斷,如果結果為空,則需要重新寫入資料。這樣可以節省一次查詢。

 c、更好的辦法是在mysql每次重新啟動時自動寫入資料到heap,但是需要配置伺服器,過程比較複雜,通用性受到限制。

六、記憶體表的注意事項

1、heap不允許使用xxxtext和xxxblob資料類型;隻允許使用=和<=>操作符來搜尋記錄(不允 許& amp; lt;、>、<=或>=);mysql4.1版本之前不支援auto_increment;隻允許對非空資料列進行索引(not null)。

注:操作符 “<=>” 說明:null-safe equal.這個操作符和“=”操作符執行相同的比較操作,不過在兩個操作碼均為null時,其所得值為1而不為null,而當一個操作碼為null時,其所得值為0而不為null。

2、記憶體表可以通過max_heap_table_size = 2048m來加大使用的記憶體。

3、記憶體表必須使用memory存儲引擎

視圖和臨時表的差別

視圖隻是一條預編譯的sql語句,并不儲存實際資料

臨時表是儲存在tempdb中的實際的表

實體空間的配置設定不一樣,試圖不配置設定空間,   臨時表會配置設定空間

視圖是一個快照,是一個虛表

臨時表是客觀存在的表類型對象create temporary table 

它們的結構一個是表、一個快照。可以把視圖像象成聯合表的快捷方式

視圖存在性能缺陷 視圖不會用到索引?有性能問題?