2011-03-25 50 views
2

我們啓動了一個ALTER TABLE,它刪除了一個索引並添加了另一個索引。雖然我們只希望表被鎖定寫入,但讀取開始排隊,所以我們終止了ALTER過程。但是當KILL結束時,舊的指數消失了,新的指數取而代之,基數低於預期。ALTER TABLE語句可能會導致部分內建索引嗎?

在桌面上搜索似乎現在更快,所以它看起來像ALTER經過很好,但我們不知道。我們的KILL是否有可能在部分建成階段離開指數?

+1

一件事要注意的是InnoDB的測算基數:http://www.mysqlperformanceblog.com/2009/ 9月28日/爲什麼 - InnoDB的指數基數-變化,奇怪的/ – 2011-03-25 12:51:41

回答

2

如果索引在那裏,您可能會認爲它是完整的。

您可以使用SHOW CREATE TABLESHOW INDEXES查看錶格上的索引。

正如在評論中指出的,SHOW INDEXES列出的基數只是一個估計值。

您可以嘗試的一個測試是運行SHOW INDEXES,然後運行ANALYZE TABLE,然後再次運行SHOW INDEXES並查看估計的基數值是如何變化的。

1

通過您的描述(兩個讀取/寫入鎖定),您很可能會使用舊版本的InnoDB,或者將索引添加到utf8字符集的列中。

下面是它如何在您的版本:

  1. 空表與新表定義創建。
  2. 將行從舊錶複製到新表(也會創建新索引)。
  3. 一旦複製完成,舊錶被刪除,新表被重新命名。

完全公開(如果步驟2 & 3新表只是安全刪除之間取消。) - 這裏是InnoDB的插件是如何工作的(默認爲MySQL 5.5,可從5.1+ ):

  1. 通過讀取表來查找索引的數據並寫入臨時文件。
  2. 對臨時文件進行排序。
  3. 該索引是通過按順序插入數據而創建的。

(這種方法更優化InnoDB的要求是「快速索引創建」。)

相關問題