mysql – 删除表的多个KEYS
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了mysql – 删除表的多个KEYS,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2885字,纯文字阅读大概需要5分钟。
内容图文
![mysql – 删除表的多个KEYS](/upload/InfoBanner/zyjiaocheng/897/dd0f866888364c7b90052a8ad13cb6a0.jpg)
在表中删除多个KEYS是首选选项还是逐个删除?
“DROP KEY A,DROP KEY B,DROP KEY C”
表中有超过9亿条记录.
它在内部如何运作?
解决方法:
在一个SQL命令中删除多个索引更好.为什么?
场景#1
ALTER TABLE mytable DROP INDEX ndx1;
ALTER TABLE mytable DROP INDEX ndx2;
ALTER TABLE mytable DROP INDEX ndx3;
这就是会发生的事情
>创建一个空的临时表
>从空临时表中删除索引
>将数据复制到临时表中
>用原始表交换临时表
>丢弃原始表
在#SCENARIO#1中,这将发生三次.
场景#2
ALTER TABLE mytable
DROP INDEX ndx1,
DROP INDEX ndx2,
DROP INDEX ndx3
;
您是否相信MySQL曾经在2006年的MySQL 4.1下进行过3次转换?换句话说,SCENARIO#2将像SCENARIO#1一样处理.我实际上在MySQL AB一般论坛中写了一篇文章,要求对其进行更改(Why does mysql drop index very very slow in a large table?).
有人在DBA StackExchange中询问MySQL是否仍然这样做.我在这里写了一篇文章,说这不再是这种情况(Does MySQL still handle indexes in this way?),那个问题引用了my original MySQL AB post.
MySQL今天做的是:
>创建临时表
>针对空临时表运行3个ALTER TABLE命令
>将数据复制到临时表ONCE
>用原始表交换临时表
>丢弃原始表
因此,您可以相信MySQL今天会做正确的事情.
你应该选择SCENARIO#2.
试试看 !!!
更新2015-01-02 13:06美国东部时间
你问过
What will happen to new operations to the table? Where will new records gets stored at the time of copying? Would it take table lock or metadata lock ?
该表将在整个时间内被锁定.当然,SCENARIO#1的锁定时间是SCENARIO#2的三倍.如果您无法停止此操作,则只有一个选项:pt-online-schema-change.更改期间将正确处理所有INSERT,UPDATE和DELETE.
更新2015-01-03 08:33美国东部时间
@eroomydna just posted a comment.
@rolando, had you considered the effect of dev.mysql.com/doc/refman/5.5/en/innodb-create-index.html and is default on 5.6. Table should not be rebuilt with the above grouped ddl. No need to use pt-osc for this operation.
@eroomydna指出这一点是正确的.他提供的URL可以深入了解这一点.
对于你的特定问题,@ aeromydna说不需要pt-online-schema-change,他在这个例子中是正确的,因为你丢弃了三个索引.注意Implementation Details of Fast Index Creation, Paragraph 2:
Dropping a secondary index is simple. Only the internal InnoDB system tables and the MySQL data dictionary tables are updated to reflect the fact that the index no longer exists. InnoDB returns the storage used for the index to the tablespace that contained it, so that new indexes or additional table rows can use the space.
你有一个9亿的表,可能还有很多索引页面.正在以逻辑方式删除索引,并且必须使所有这些页面无效以使该空间可重用.这还将创建许多共享锁,允许读取和阻止写入.所以,这个操作应该相对较快.我需要多长时间才能告诉你.既然你说你不能承受停机时间,那么对于有大量共享锁和被阻止写入的实时表,它可能是几秒,几分钟甚至几小时.
如果您在DEV或测试服务器上有该表的副本,请运行DROP KEY A,DROP KEY B,DROP KEY C,以便您可以看到它的运行速度.然后,您可以考虑停机时间是否值得.尽管如此,如果你想让桌子上线并且真的无法完成停机,你仍然可以使用pt-online-schema-change.
至于我的答案,它只适用于
>删除索引并创建具有相同名称的索引
>删除/添加PRIMARY KEY
内容总结
以上是互联网集市为您收集整理的mysql – 删除表的多个KEYS全部内容,希望文章能够帮你解决mysql – 删除表的多个KEYS所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。