ICode9

精准搜索请尝试: 精确搜索
首页 > 数据库> 文章详细

mysql – 删除表的多个KEYS

2019-08-06 00:16:46  阅读:347  来源: 互联网

标签:mysql innodb alter-table index


在表中删除多个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,innodb,alter-table,index
来源: https://codeday.me/bug/20190805/1593769.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有