MySQL 中的暫存資料表和記憶體表
MySQL記憶體表:
1、通過My.cnf中的max_heap_table_size指定,支援動態指定
2、表定義是存放在磁碟上的,副檔名為.frm,重啟不會丟失,資料是存放在記憶體中的,所以重啟會遺失資料
3、不支援BLOB或TEXT列
4、記憶體表初始化,可以使用--init-file來初始化,避免重啟mysql後資料被清空。比如--init-file="/data/mysql/init.sql", init.sql格式為:
use db_test;
select *** into m_table;
5、在資料庫複寫時,如果主機當掉,則會在下次對主庫訪問的暫存資料表訪問時對binLog自動加入delete from [記憶體表],將slave的資料也刪除掉,以保證兩邊的資料一致性。
6、記憶體表不支援事務。
7、記憶體表是表鎖,當修改頻繁時,效能可能會下降。
8、對於重啟造成的資料丟失,有以下的解決辦法:
1、在任何查詢之前,執行一次簡單的查詢,判斷heap表是否存在資料,如果不存在,則把資料重新寫入,或者DROP表重新複製某張表。這需要多做一次查詢。不過可以寫成include檔案,在需要用該heap表的頁面隨時調用,比較方便。
2、對於需要該heap表的頁面,在該頁面第一次且僅在第一次查詢該表時,對資料集結果進行判斷,如果結果為空白,則需要重新寫入資料。這樣可以節省一次查詢。
3、更好的辦法是在mysql每次重新啟動時自動寫入資料到heap,但是需要設定管理員,過程比較複雜,通用性受到限制。
MySQL暫存資料表:
1、暫存資料表最大所需記憶體需要通過tmp_table_size設定,實際最大記憶體由max_heap_table_size和tmp_table_size的最小值決定,tmp_table_size對每個線程分配
2、如果記憶體暫存資料表超出了限制,MySQL就會自動地把它轉化為基於磁碟的MyISAM表,儲存在指定的tmpdir目錄下
3、Created_tmp_disk_tables 和 Created_tmp_tables 可以看出暫存資料表和磁碟建立的數量,一般Created_tmp_disk_tables/Created_tmp_tables<5%
4、create temporary table tmp1(id int not null); 可以建立暫存資料表
本文永久更新連結地址: