1. 程式人生 > >臨時表和記憶體表

臨時表和記憶體表

前景

  • mysql三種虛擬表
    • 臨時表
    • 記憶體表
    • 檢視

臨時表

簡介:

臨時表是建立在系統臨時資料夾中的表。臨時表的資料和表結構都儲存在記憶體之中,退出的時候所佔的空間會被釋放

建立臨時表

create temporary table tmp_table(
name varchar(10) not ,
value int not 
);

關鍵字為temporary

查看錶結構

注意:

show tables;
show table status

這兩個命令無法檢視臨時表。 但是可以查記憶體表


可以查看錶建立sql語句

show create table tmp_table;
  

    直接將查詢結果匯入臨時表

    CREATE TEMPORARY TABLE tmp_table SELECT * FROM table_name

    設定臨時表大小

    tmp_table_size臨時表的容量

    臨時表的應用場景

    當工作在十分大的表上執行時,執行相關查詢,來獲的一個大量資料的小的子集。較好的辦法,不是對整個表執行這些查詢,而是讓MySQL每次找出所需的少數記錄,將記錄選擇到一個臨時表,然後對這些表執行查詢

    • 一個sql語句關聯兩個表以上的時候,查詢到的結果存放在臨時表中。
    • 程式執行過程中可能需要存放一些臨時的資料,這些資料在整個程式的會話過程中都需要用的等等
    • 臨時表預設的是MyISAM,但是可以修改
    • 內部臨時表,就是查詢的時候,伺服器會優化查詢,使用內部臨時表。比如 order by 的列不是from中的第一列。
    select *
    from instructor natural join teaches
    where dept_name='Accounting'
    
    
    

    get到的新技能- - -檢視執行計劃

    explain extended select * from instructor natural join teaches where
    dept_name='Accounting'
    - show warnings 能檢視優化查詢的sql語句
    
    

    show warnings
    - explain extended能檢視執行使用的各種東西
    explain

    臨時表的注意事項

    • 臨時表只在當前連線可見,當這個連線關閉的時候,會自動drop。比如開啟mysql 就是一個連線會話。兩個不同的連線可以使用相同名字的臨時表,兩個表之間不存在什麼關係,如果臨時表的名字和已經存在的磁碟表名字一樣,那麼臨時表會暫時覆蓋磁碟表。就是說,你select 查詢,只會顯示臨時表裡面的,不會顯示磁碟表。
    • 臨時表的儲存引擎:memor,myisam,merge,innodb
    • 臨時表不支援,mysql cluster
    • 同一個查詢語句,只能用一次臨時表,就是說不能將表和自己做連線等。
    • 重命名錶,不能用rename 可以用alter table代替
    • 如果超出了臨時表的容量,臨時表會轉換成磁碟表
    alter table old_name rename new_name
        

      記憶體表

      簡介:
      記憶體表的表結構建立在磁盤裡面,資料放在記憶體裡面,當mysql重啟之後,記憶體表的資料會丟失,表結構依舊存在會執行一次truncate操作

      記憶體表的建立

      CREATE TEMPORARY TABLE tmp_table (
      name VARCHAR(10) NOT NULL,       
      value INTEGER NOT NULL 
      )  TYPE = HEAP  注意: TYPE = HEAP必須要有

      和臨時表不同的地方在於,多了個type=heap

      使用場景及注意事項

      記憶體表使用hash索引把資料儲存在記憶體中,具有更快的速度,可以用來快取。

      • 記憶體表對所有的使用者連線都是可用的。這就意味著,多個會話連線的記憶體表名字不能重複,具有唯一性
      • 記憶體表如果複製資料進去的話,所有的原有格式都不會存在,需要重新設定
      • 重啟造成資料丟失,可以drop表之後重新複製資料等。這是最傻瓜的方法了。一定有更好的方法(待補充)
      • 支援簡單的操作符>=<這三個,我認為記憶體表用來快取的話,應該不會涉及很複雜的操作。
      • 不好的地方的話,應該在於資料了,因為資料都在記憶體裡,處理起來應該蠻麻煩
      • 記憶體表的預設引擎是memory

      總結

      對比一下記憶體表和臨時表的一些主要區別吧

      • 儲存
        • 記憶體表 表結構儲存在磁碟中,資料儲存在記憶體中
        • 臨時表 表結構和資料都儲存在記憶體中
      • 會話
        • 記憶體表 是可以多個會話共享的
        • 臨時表 是單個會話獨享的,是會話級別的
      • 引擎
        • 記憶體表預設,memory
        • 臨時表預設,myisam
      • 斷開連線
        • 臨時表 啥都不剩
        • 記憶體表 只剩下表結構
      • 效能
        • 記憶體表由於所有的內容都是放在記憶體中,所以相對來說,速度較快但是同時資料的維護較為困難

      前景