避免必须进行预热"新表是旧的索引吗?
答案 0 :(得分:1)
是的,所有索引都包含在新表的定义中。
这很容易测试:
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。
之后缓冲池中有很多页面