为了避免对新表进行“预热”,旧的索引会保留吗?
发布于 2013-12-18 00:31:38
是的,所有索引都包含在新表的定义中。
这很容易测试:
mysql> create table test.sometable
( x int primary key, y int, z int, unique key (y), key (z,y));然后尝试使用pt-online-schema- change更改表:
$ pt-online-schema-change D=test,t=sometable --alter "ENGINE=InnoDB" --execute现在检查该表,以确保它仍然具有开始时的索引:
mysql> SHOW CREATE TABLE test.sometable\G但是,您的问题提到了“预热”,这是一个经常与将表中的页放入缓冲池相关联的短语。当ALTER对页面进行更改时,它们必须在前往磁盘的途中位于缓冲池中。因此,在ALTER结束时,缓冲池中确实有很多页。
您可以使用MySQL 5.5和5.6中提供的用于InnoDB指标的新INFORMATION_SCHEMA表来测试这一点:
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改变了,但是在alter之后缓冲池中有很多页。
https://stackoverflow.com/questions/20487420
复制相似问题