今天有同事提到一篇博客:http://blogs.innodb.com/wp/2010/09/mysql-5-5-innodb-change-buffering/
裏面提到:
當更新非聚集索引上記錄 和 聚集索引上的主鍵時,是標記刪除,然後插入新的記錄
當更新聚集索引上的非主鍵列時,是updated-in-place,也就是說原地修改,不會插入新記錄。
之前一直以爲都是以標記刪除作處理的,翻了下代碼。找到兩個函數:
btr_cur_del_mark_set_sec_rec 對非聚集索引上的記錄進行標記刪除
btr_cur_del_mark_set_clust_rec 對聚集索引上的記錄進行標記刪除
證明的過程很簡單,就是設置兩個斷點,然後更新不同的索引列來證明,過程不多說了,結果和那篇博客裏提到的很吻合。
一直認爲正確的觀點其實是錯誤的,得出一個結論:任何真理都可以從代碼裏求證……