
沒有where的count(*)使用MyISAM要比InnoDB快得多。因?yàn)镸yISAM內(nèi)置了一個(gè)計(jì)數(shù)器,count(*)時(shí)它直接從計(jì)數(shù)器中讀,而InnoDB必須掃描全表。所以在InnoDB上執(zhí)行count(*)時(shí)一般要伴隨where,且where中要包含主鍵以外的索引列。為什么這里特別強(qiáng)調(diào)“主鍵以外”?因?yàn)镮nnoDB中primary index是和raw data存放在一起的,而secondary index則是單獨(dú)存放,然后有個(gè)指針指向primary key。所以只是count(*)的話使用secondary index掃描更快,而primary key則主要在掃描索引同時(shí)要返回raw data時(shí)的作用較大。MyISAM相對簡單,所以在效率上要優(yōu)于InnoDB,小型應(yīng)用可以考慮使用MyISAM。
MyISAM和InnoDB兩者的應(yīng)用場景:
1) MyISAM管理非事務(wù)表。它提供高速存儲和檢索,以及全文搜索能力。如果應(yīng)用中需要執(zhí)行大量的SELECT查詢,那么MyISAM是更好的選擇。
2) InnoDB用于事務(wù)處理應(yīng)用程序,具有眾多特性,包括ACID事務(wù)支持。如果應(yīng)用中需要執(zhí)行大量的INSERT或UPDATE操作,則應(yīng)該使用InnoDB,這樣可以提高多用戶并發(fā)操作的性能。
但是實(shí)際場景中,針對具體問題需要具體分析,一般而言可以遵循以下幾個(gè)問題:
-? 數(shù)據(jù)庫是否有外鍵??
-? 是否需要事務(wù)支持??
-? 是否需要全文索引??
-? 數(shù)據(jù)庫經(jīng)常使用什么樣的查詢模式?在寫多讀少的應(yīng)用中還是Innodb插入性能更穩(wěn)定,在并發(fā)情況下也能基本,如果是對讀取速度要求比較快的應(yīng)用還是選MyISAM。?
-? 數(shù)據(jù)庫的數(shù)據(jù)有多大? 大尺寸傾向于innodb,因?yàn)槭聞?wù)日志,故障恢復(fù)。
Mysql存儲引擎之memory
(1)memory是基于內(nèi)存數(shù)據(jù)的存儲引擎
(2)一張memory表,在磁盤上有一個(gè)表定義文件(.frm),在內(nèi)存中保存數(shù)據(jù)。
(3)特點(diǎn):基于內(nèi)存,所以訪問速度特別快。
(4)默認(rèn)使用Hash索引,也可以指定B樹索引。
(5)注意:mysql服務(wù)關(guān)閉,則表的數(shù)據(jù)就會丟失。
(6)使用memory,要注意內(nèi)存是否足夠。對不用的memory表,要及時(shí)刪除或truncate;
(7)每個(gè)memory表的大小受系統(tǒng)變量max_heap_table_size的約束,初始值為16MB
(8)可以在使用--init-file選項(xiàng)包含一個(gè)文件,在文件中寫入諸如
? ? ? ? insert into ...select? 或者 load data infile 。
? ? ? ?效果是在mysql服務(wù)啟動時(shí),從持久穩(wěn)固的數(shù)據(jù)源中裝載數(shù)據(jù)。