MySQL的內存表可以手動創建臨時表和內存表,但臨時表的重要作用是組織數據以提高性能,不能在多個連接之間共享臨時表,本文是武林技術頻道和大家分享的MySQL的內存表的基礎學習教程,一起來看看吧!
這里只討論內存表
創建表是,用engine=heap可創建(mysql5.5中已經不支持type,以后都用engine,形成習慣)。
create table test( id int unsigned not null auto_increment primary key, state char(10), type char(20), date char(30))ENGINE=MEMORY DEFAULT CHARSET=utf8;
內存表的特性
1.對于varchar等變長類型,內存表使用固定的長度來存放;
2.內存表可以有非唯一鍵;
3.內存表不能包含BLOB或者TEXT列;
4.內存表支持AUTO_INCREMENT列;
5.內存表支持插入延遲,使讀取優先;
6.非臨時內存表和其它非內存表一樣在所有客戶端直接共享;
我們使用內存表的時候,需要注意以下幾個方面:
1.服務器內存足夠大;
2.我們創建的內存表和MySQL內部臨時表有所不同:
????? 內存表的數據存放在內存中,而內部臨時表(我們的query語句產生的)在恰當的時候存放在內存中,當內部臨時表變得很大時,MySQL會自動地把它轉化為 在磁盤上存儲的表,而我們創建的內存表,卻不會自動轉換。
3.當我們單獨地delete from 某個內存表的時候,不會回收內存;只有當整個表被delete的時候,才會回收內存;
4.在MySQL的主從服務器上,內存表可以被復制
內存表的一些使用限制
MySQL內存表使用哈希散列索引把數據保存在內存中,因此具有極快的速度,適合緩存中小型數據庫,但是使用上受到一些限制。
1、heap對所有用戶的連接是可見的,這使得它非常適合做緩存。
2、僅適合使用的場合。heap不允許使用xxxTEXT和xxxBLOB數據類型;只允許使用=和<=>操作符來搜索記錄(不允許& lt;、>、<=或>=);不支持auto_increment;只允許對非空數據列進行索引(not null)。
注:操作符 “<=>” 說明:NULL-safe equal.這個操作符和“=”操作符執行相同的比較操作,不過在兩個操作碼均為NULL時,其所得值為1而不為NULL,而當一個操作碼為NULL時,其所得值為0而不為NULL。
3、一旦服務器重啟,所有heap表數據丟失,但是heap表結構仍然存在,因為heap表結構是存放在實際數據庫路徑下的,不會自動刪除。重啟之后,heap將被清空,這時候對heap的查詢結果都是空的。
4、如果heap是復制的某數據表,則復制之后所有主鍵、索引、自增等格式將不復存在,需要重新添加主鍵和索引,如果需要的話。
5、對于重啟造成的數據丟失,有以下的解決辦法:
a、在任何查詢之前,執行一次簡單的查詢,判斷heap表是否存在數據,如果不存在,則把數據重新寫入,或者DROP表重新復制某張表。這需要多做一次查詢。不過可以寫成include文件,在需要用該heap表的頁面隨時調用,比較方便。
b、對于需要該heap表的頁面,在該頁面第一次且僅在第一次查詢該表時,對數據集結果進行判斷,如果結果為空,則需要重新寫入數據。這樣可以節省一次查詢。
c、更好的辦法是在mysql每次重新啟動時自動寫入數據到heap,但是需要配置服務器,過程比較復雜,通用性受到限制。
藍草目前采用的是第二種辦法。
6、一些預期可能用到的sql語句
//如果表存在,則刪除DROP TABLE IF EXISTS `abc`;//復制整張表xyz為heap表abc(包含所有數據)CREATE TABLE `abc` type=heap select * from `xyz`;//添加主鍵idALTER TABLE `abc` ADD PRIMARY KEY (`id`);//添加索引usernameALTER TABLE `abc` ADD INDEX `abc` (`username`);
以上就是MySQL的內存表的基礎學習教程的全部內容,如果你還想了解更多C語言的知識,你可以隨時來我們武林技術頻道學習和參考,相信一定能幫助到你。
新聞熱點
疑難解答
圖片精選