我們啓動了一個ALTER TABLE,它刪除了一個索引並添加了另一個索引。雖然我們只希望表被鎖定寫入,但讀取開始排隊,所以我們終止了ALTER過程。但是當KILL結束時,舊的指數消失了,新的指數取而代之,基數低於預期。ALTER TABLE語句可能會導致部分內建索引嗎?
在桌面上搜索似乎現在更快,所以它看起來像ALTER經過很好,但我們不知道。我們的KILL是否有可能在部分建成階段離開指數?
我們啓動了一個ALTER TABLE,它刪除了一個索引並添加了另一個索引。雖然我們只希望表被鎖定寫入,但讀取開始排隊,所以我們終止了ALTER過程。但是當KILL結束時,舊的指數消失了,新的指數取而代之,基數低於預期。ALTER TABLE語句可能會導致部分內建索引嗎?
在桌面上搜索似乎現在更快,所以它看起來像ALTER經過很好,但我們不知道。我們的KILL是否有可能在部分建成階段離開指數?
如果索引在那裏,您可能會認爲它是完整的。
您可以使用SHOW CREATE TABLE
或SHOW INDEXES
查看錶格上的索引。
正如在評論中指出的,SHOW INDEXES
列出的基數只是一個估計值。
您可以嘗試的一個測試是運行SHOW INDEXES
,然後運行ANALYZE TABLE
,然後再次運行SHOW INDEXES
並查看估計的基數值是如何變化的。
通過您的描述(兩個讀取/寫入鎖定),您很可能會使用舊版本的InnoDB,或者將索引添加到utf8字符集的列中。
下面是它如何在您的版本:
完全公開(如果步驟2 & 3新表只是安全刪除之間取消。) - 這裏是InnoDB的插件是如何工作的(默認爲MySQL 5.5,可從5.1+ ):
(這種方法更優化InnoDB的要求是「快速索引創建」。)
一件事要注意的是InnoDB的測算基數:http://www.mysqlperformanceblog.com/2009/ 9月28日/爲什麼 - InnoDB的指數基數-變化,奇怪的/ – 2011-03-25 12:51:41