1. 程式人生 > >MySQL8.0.13: 幾個和innodb效能相關的小改動

MySQL8.0.13: 幾個和innodb效能相關的小改動

本文簡單介紹下最新的Mysql8.0.13版本幾個和效能相關的小改動

1. bug#84958

commit

問題描述:
當聚主要集索引記錄上有多個版本時,從聚集索引上讀取記錄時的時間複雜度是0(N),但通過二級索引查詢的時間複雜度可能為O(N^2)

解決思路:
程式碼是由facebook的工程師提供的補丁,主要思路是增加一個新的類Row_sel_get_clust_rec_for_mysql,其中cache了上次的clust record和老版本,可以在下次迴圈中重用。當發現定位到的clust rec和上次相同時,就無需遍歷版本鏈,直接拿上次看到的版本,否則的話更新cach的記錄

舉個簡單的例子,記錄(1,2,3), pk = 1, sec index entry = (2,3); 
記錄更新為(1,2,4), 則sec index entry上記錄為(2,3)(delete marked), (2,4), 均指向pk 1,那麼在查詢時可能需要去看對應的clust record.實際上看到的只有一個版本,那麼在第二次找到(2,4),想去檢查
記錄可見性時,就可以直接使用上次拿到的版本,無需掃描版本鏈。

但這個實現也只是快取上次的clust記錄,這意味著如果在二級索引上掃描到的記錄不是連續的,就可能用不上這個優化。

bug#91759

commit

主要改動:

在之前的版本中,innodb open一個read view,會先prepare(),在鎖保護下拷貝全域性事務id,然後在呼叫complete(), 去再更新ReadView的up_limit_id

complete可能在全域性事務鎖內或者鎖外部執行。這實際上是沒有什麼必要的,complete()函式可以徹底移除掉,對應的程式碼轉移到ReadView::prepare的執行路徑中

官方測試在arm64場景下有一定的效能提升

undo truncate

commit

從commit log來看,官方應該有個更加全面完善的修復方案,但在下一個版本修復,在當前版本只是做了部分修復。

原文連結