Mysql

Mysql Aurora 5.7 中的索引創建速度極慢

  • December 12, 2021

我在 mysql Aurora 5.7 版本中有一個表。

db 實例具有非常好的配置 488 GB ram (db.r4.16xlarge)。

數據庫是靜態數據庫,沒有應用程序在其上執行。

我在表中有 15 億條記錄,大約 2TB 大小。

該表除了主鍵之外沒有任何索引。

表有 35 列。

此表沒有任何分區

現在我需要在其他九個列上創建索引,在這裡我很努力。創建一個索引需要 5 個小時,當我執行命令同時創建所有 9 個索引時,它花了將近 10 個小時,然後我取消了。

有什麼辦法可以讓這個索引創建更快?創建 10 個分區是否有助於更快地創建索引?

為什麼我需要在 15 億條記錄上創建索引是因為我已經使用 AWS DMS 服務將我的表從 Orcale 源遷移到了 Mysql。

在遷移之前,我需要在目標處刪除索引,然後必須遷移,這樣遷移會更快,而且實際上非常快。

沒有 Index 遷移需要 10 個小時,而使用 Index 需要 25 個小時,有時它也會失敗。

你有很多行,每一行都必須插入索引,這需要時間,忍受它。

您可以嘗試對所有列僅使用一個索引

CREATE INDEX name 
ON yourtable(column1,column2,column3,column4...colmn9);

這也需要很長時間,但應該更快

分區很少有助於提高性能。 http://mysql.rjweb.org/doc.php/partitionmaint

將索引添加到分區表可能比等效的非分區表花費更長的時間——它將在整個操作過程中阻塞訪問。

甲骨文的 MySQL 有幾個重要的變化;Aurora 可能還沒有把它們撿起來。(我不知道 Aurora 5.7 與 MySQL 5.7 有多接近。)你標記了這個問題[mysql-5.6];是哪一個?

讓我們看看您要添加的實際索引;可能有一些技巧和/或註意事項需要討論。

通常,索引“標誌”或其他低基數列是*沒有用的。*也就是說,如果它們在索引中單獨存在。

前綴很少有用。例子:INDEX(foo(10))

Percona Toolkit可能會有所幫助。

讓我們看看需要它們的查詢;可能有一些“複合”索引會更有幫助。也SHOW CREATE TABLE

引用自:https://dba.stackexchange.com/questions/267756