Mysql

MySQL 是否仍然以這種方式處理索引?

  • December 8, 2020

在 MySQL 中刪除重複索引需要相當長的時間,所以在我等待的時候,我搜尋了它並找到了 2006 年的這篇文章,談論 MySQL 如何處理ADDDROP索引。

如果表 T 是具有四個索引 (ndx1,ndx2,ndx3,ndx4) 的 MySQL 表,並且您想要 ‘alter table T drop index ndx3;’ 這正是幕後發生的事情:

  1. MySQL 將 T.MYD 複製到一個臨時表,即 S.MYD 和一個零字節的 S.MYI。2) MySQL 確實 ‘alter table S add index ndx1 (…); 3) MySQL 確實 ‘alter table S add index ndx2 (…); 4) MySQL 確實 ‘alter table S add index ndx4 (…); 5) MySQL 刪除 T.MYD 並刪除 T.MYI 6) MySQL 將 S.MYD 重命名為 T.MYD,並將 S.MYI 重命名為 T.MYI

這仍然是真的嗎?他的建議還有效嗎?

給定具有四個索引 (ndx1,ndx2,ndx3,ndx4) 的同一個 MyISAM 表 T,並且您想要“更改表 T 刪除索引 ndx3;” 試試這個:

1)像T一樣創建表T1;這將創建一個具有索引 ndx1、ndx2、ndx3 和 ndx4 的空表 T1。2)alter table T1 drop index ndx3;這會在空 T1 上刪除索引 ndx3,這應該是瞬時的。3) 插入T1 select * from T; 這將填充表 T 並一次性載入 T1 的所有三 (3) 個索引。4)刪除表表T;5) 將表 T1 重命名為 T;

你們都是如何處理從大表中添加和刪除索引的?

這就是 MySQL 4.x 的做法,它曾經嚴重地激怒了我。

事實上,我計算了一個公式來計算需要多少次這樣的指數操作

Table with 0 indexes and adding 1 index tooks 1 temp table
Table with 1 index   and adding 1 index tooks 3 temp tables
Table with 2 indexes and adding 1 index tooks 6 temp tables
Table with 3 indexes and adding 1 index tooks 10 temp tables (I had eyewitnessed this !!!)
.
.
.
Table with n indexes and adding 1 index took (n + 1) X (n + 2) / 2 temp tables
.
.
.
Table with 16 indexes and adding 1 index took 153 temp tables

好消息,MySQL 5.x 不這樣做!

如果 MySQL 5.x 做到了這一點,我今天將成為一名 PostgreSQL DBA(無意冒犯 PostgreSQL,它本身就是一個出色的 RDBMS)。

更新

天哪,我看了文章!!!那個文章是我發的!!!

我從沒想過有人會探勘這個文章。

請讓這樣的東西死去並埋葬。現在我有閃回!

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