對于像這樣的選擇陳述句
select * from table where indexed_col='abc';
sql 將轉到索引表并獲取行地址并回傳所需。但是像這樣的 dml 陳述句呢?
update table set indexed_col='abc' where condition;
如何確保表和索引表之間的一致性?
uj5u.com熱心網友回復:
indexed_col當您更新該列時,MySQL 會更新包含該列的所有索引。
當然,它必須更新聚集索引(又名主鍵索引)。給定行的列存盤在聚集索引的葉節點中,因此更改任何列都需要更新該索引。
同一表上包含更新列的其他唯一索引必須同時更新。換句話說,當您執行 UPDATE 時,執行該陳述句所需的時間包括更新聚集索引的時間以及包含 column 的任何唯一索引的時間indexed_col。
對于非唯一二級索引,MySQL 的默認存盤引擎 InnoDB 使用更改緩沖區,這是對這些索引的待處理更改的臨時串列。當您更新列時indexed_col,MySQL 會為該列所屬的每個索引的更改緩沖區添加一個條目。然后它呼叫你的 UPDATE done 的執行,并將控制權回傳給客戶端。
如果您隨后按所示執行 SELECT 查詢,MySQL 將檢查表的索引和更改緩沖區。該索引的更改緩沖區中的任何條目都具有優先權,因為它們反映了最近的更改。
最終,MySQL 運行一個后臺執行緒將更改緩沖區條目合并到相應的索引中。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/349945.html
