MyISAM查詢速度為什麼比InnoDB快

2021-09-29 13:46:51 字數 835 閱讀 3185

innodb、mylsam兩者引擎所用的索引的資料結構都是b+樹,不過區別在於:

mylsam中的b+樹的資料結構儲存的內容是實際資料的位址值,它的索引和實際資料是分開的,只不過使用索引指向實際資料,這種索引的模式被成為非聚集索引。

innodb中b+樹的資料結構儲存的都是實際的資料,這種索引稱為聚集索引。

1)資料塊,innodb要快取,myisam只快取索引塊, 這中間還有換進換出的減少;

2)innodb定址要對映到塊,再到行,myisam記錄的直接是檔案的offset,定位比innodb要快

3)innodb還需要維護mvcc一致;雖然你的場景沒有,但他還是需要去檢查和維護

mvcc (multi-version concurrency control)多版本併發控制

注釋:innodb:通過為每一行記錄新增兩個額外的隱藏的值來實現mvcc,這兩個值乙個記錄這行資料何時被建立,另外乙個記錄這行資料何時過期(或者被刪除)。但是innodb並不儲存這些事件發生時的實際時間,相反它只儲存這些事件發生時的系統版本號。這是乙個隨著事務的建立而不斷增長的數字。每個事務在事務開始時會記錄它自己的系統版本號。每個查詢必須去檢查每行資料的版本號與事務的版本號是否相同。讓我們來看看當隔離級別是repeatableread時這種策略是如何應用到特定的操作的:

select innodb必須每行資料來保證它符合兩個條件:

1、innodb必須找到乙個行的版本,它至少要和事務的版本一樣老(也即它的版本號不大於事務的版本號)。這保證了不管是事務開始之前,或者事務建立時,或者修改了這行資料的時候,這行資料是存在的。

2、這行資料的刪除版本必須是未定義的或者比事務版本要大。這可以保證在事務開始之前這行資料沒有被刪除

為什麼說 i比i 效率高?

不知道你是否聽說過 i比i 快的說法,真的如此嗎?這兩個表示式從我們初學程式語言的時候就會接觸到。前者是自增後取值,後者是取值後自增。我們看乙個簡單的例子。include using namespace std int main 編譯後報錯 main.cpp 7 19 error lvalue re...

為什麼MyISAM會比Innodb的查詢速度快

innodb在做select的時候,要維護的東西比myisam引擎多很多 1 資料塊,innodb要快取,myisam只快取索引塊,這中間還有換進換出的減少 2 innodb定址要對映到塊,再到行,myisam記錄的直接是檔案的offset,定位比innodb要快 3 innodb還需要維護mvcc...

為什麼索引可以提高查詢速度

參考 以下是關於索引的個人理解 有這麼乙個students表 我們執行一條sql語句 select from students where name 老頑童 執行結果 如果我們沒有為name欄位建立索引,這條sql語句是從頭開始一條一條比較的,比較七次 找到了老頑童所在的這一條資料。如果此時我們為n...