首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用pt-online-schema-change工具时,是否可以保留原始表的索引?

使用pt-online-schema-change工具时,是否可以保留原始表的索引?
EN

Stack Overflow用户
提问于 2013-12-10 14:11:55
回答 1查看 328关注 0票数 0

为了避免对新表进行“预热”,旧的索引会保留吗?

EN

回答 1

Stack Overflow用户

发布于 2013-12-18 00:31:38

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

这很容易测试:

代码语言:javascript
复制
mysql> create table test.sometable 
  ( x int primary key, y int, z int, unique key (y), key (z,y));

然后尝试使用pt-online-schema- change更改表:

代码语言:javascript
复制
$ pt-online-schema-change D=test,t=sometable --alter "ENGINE=InnoDB" --execute

现在检查该表,以确保它仍然具有开始时的索引:

代码语言:javascript
复制
mysql> SHOW CREATE TABLE test.sometable\G

但是,您的问题提到了“预热”,这是一个经常与将表中的页放入缓冲池相关联的短语。当ALTER对页面进行更改时,它们必须在前往磁盘的途中位于缓冲池中。因此,在ALTER结束时,缓冲池中确实有很多页。

您可以使用MySQL 5.5和5.6中提供的用于InnoDB指标的新INFORMATION_SCHEMA表来测试这一点:

代码语言:javascript
复制
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之后缓冲池中有很多页。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20487420

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档