2013-12-10 32 views

回答

1

是的,所有索引都包含在新表的定義中。

這很容易測試:

mysql> create table test.sometable 
    (x int primary key, y int, z int, unique key (y), key (z,y)); 

然後嘗試更改表PT-在線模式的變化:

$ pt-online-schema-change D=test,t=sometable --alter "ENGINE=InnoDB" --execute 

現在檢查表,以確保它仍然有索引它開始:

mysql> SHOW CREATE TABLE test.sometable\G 

但是,你的問題提到「熱身」,這是一個常常是一個詞組d將頁面從緩衝池中的表中取出。當ALTER對頁面進行更改時,它們必須在通往磁盤的緩衝池中。所以在ALTER結束時,你在緩衝池中確實有很多頁面。

您可以用新的INFORMATION_SCHEMA表InnoDB的指標是存在在MySQL 5.5和5.6測試:

mysql> SELECT TABLE_NAME, SPACE, COUNT(*) AS num_pages 
    FROM INFORMATION_SCHEMA.INNODB_BUFFER_PAGE_LRU 
    WHERE TABLE_NAME = '`mydatabase`.`mytable`' 
    GROUP BY TABLE_NAME, SPACE; 
-- Result shows a lot of pages loaded 

mysql> ALTER TABLE mydatabase.mytable ENGINE=INNODB; -- dummy table restucture 

mysql> SELECT TABLE_NAME, SPACE, COUNT(*) AS num_pages 
    FROM INFORMATION_SCHEMA.INNODB_BUFFER_PAGE_LRU 
    WHERE TABLE_NAME = '`mydatabase`.`mytable`' 
    GROUP BY TABLE_NAME, SPACE; 
-- Result shows a lot of pages still loaded, but the space id has changed 

但在情況下,當表比緩衝池的容量更大,你結束不能保證頁面的一個子集,並且該子集是否適合該表的預熱緩衝池。

當您使用pt-online-schema-change時會發生同樣的情況。表空間id發生了變化,但是在修改後緩衝池中有很多頁面。

相關問題