大桌子在MySQL一个大表是一个疼痛的原因很多,只要它是一个系统。如果这还不够,这也是一个艰巨的任务来摆脱它。在这篇文章中,我们将明白为什么这是一个痛苦做这个操作,我们能做什么。它会像要求表“告诉我发生了什么事,我将放松驱逐”。

那么发生了什么?当一个表被删除(或截断),InnoDB扫描整个缓冲池页面和删除所有这些属于表。对于大型缓冲池,这爬在缓冲池页面和拆迁过程中会慢。当我们说“扫描缓冲池”,它主要是寻找“LRU”,“冲”(脏页),和“你好”条目。

LRU:缓冲池页面存储在一个链表的页面的顺序使用。作为数据的列表,是驱逐新数据的空间。当房间需要添加一个新页面缓冲池,最近最少使用页面驱逐和添加到一个新的页面列表的中间

你好:这是一个散列索引包含频繁访问的索引页。InnoDB搜索机制,监测指数。raybet雷竞技竞猜在线官网如果InnoDB通知,查询可以受益于构建一个散列索引,它自动。

免责声明:

这个问题我们会讨论<一个href="https://dev.mysql.com/worklog/task/?id=14100" target="_blank" rel="noopener">解决在MySQL 8.0.23(开始)虽然这仍然是许多MySQL相关部署在低版本。从MySQL 8.0.23,删除表的过程已得到改进和MySQL不再等待驱逐。InnoDB实现一个懒惰驱逐过程各自的页面缓冲池。

检查引擎INNODB样本状态如下:

注意“数据库页面”和“LRU len”,代表需要扫描的页面数。

接下来,把球传递给底层操作系统删除该文件。根据多大文件和系统是多忙,IO操作是需要时间的。

一般来说,成本为drop table操作演习到以下两个任务:

  1. 遍历缓冲池和驱逐的页面找到
  2. 从操作系统磁盘删除文件

两个任务一是mysql,任务是依赖操作系统(磁盘)。我们将在这两个方面寻找改善的过程。

1。遍历缓冲池和驱逐的页面找到

看看我们可以找出方法来提高性能的任务。

想法一:缓冲池很大,所以是链表;我们可以暂时减少缓冲池和链表小吗?

的步骤是:

保存当前的缓冲池状态>减少缓冲池大小>删除表(扫描小列表)>重置缓冲池大小>恢复缓冲池的内容

听起来很简单,但它不工作;实际上,这让情况变得更糟,因为以下的原因。

  • 缓冲池大小是一个阻塞操作,它将仍然需要扫描列表,整理和调整缓冲池。
  • 减少交通运行缓冲池的性能损失。
  • 相同的阻塞操作将重复在缓冲池扩展。

参考:https://dev.mysql.com/doc/refman/5.7/en/innodb-buffer-pool-resize.html

想法二:停止使用的表(没有选择,没有写在桌子上需要删除)

  • 可以避免表操作的撤销授予用户在桌子上或在应用程序级别控制读/写。
  • 这将导致缓冲池慢慢驱逐页面根据MySQL是多忙。
  • 拆迁过程将有所缓解,遍历整个链表,它不会找到任何相关页表。
  • 说,你仍将扫描链表。

总之MySQL级别,你不能避免遍历链表缓冲池的但是你可以节省一些时间等待拆迁过程,让缓冲池最终驱逐的。

2。删除文件从磁盘操作系统

现在,这个任务取决于和快速磁盘有多忙。文件删除操作,越慢越需要MySQL返回“删除成功”。所以我们能做什么来改善这个删除操作吗?让我们来看看。

想法一:较小的磁盘上的文件,就会越快。

我们可以清除较小的磁盘上的数据的数据表。这是我们可以使用pt-archiver做。说,表会变得支离破碎,规模仍将保持不变,除非一个优化表或一个虚拟的改变(alter table…引擎= InnoDB)执行。

使用pt-archiver慢慢删除表记录>降低表大小>给LRU算法时间驱逐这些页面从缓冲池>下降

这种方法涉及多个活动需要更多的时间作为存档流程之后,冷却时间可能需要更长的时间基于表的大小。现在注意,对于较大的表,pt-archiver会花很长时间。我们仍将有一个支离破碎的表有一个很大的表大小的磁盘上,直到我们运行一个虚拟的改变。

想法二:不删除底层表空间文件(ibd)

如果我们完全跳过文件删除操作?MySQL将返回命令一旦缓冲池扫描完成!但我们可以吗?

是的,部分是的。我们可以使用一个硬链接“傻瓜”MySQL相信表的数据文件被删除了,尽管它仍然存在!

硬链接是什么?

(你可以跳过这一部分如果你已经意识到这一概念)

硬链接是一个目录条目,将一个名称与文件。每一个文件名,你看到的是一个硬链接。让我们来探讨:

这里“per雷竞技下载官网cona。rocks” is a hard link. Note that the first value “20594511” is a file inode represented by “percona.rocks” filename. Now let’s create another hard link.

注意,我们可以看到两个不同的文件但是inode还是相同的“20594511”,指向同一个物理位置/文件。

没有进入更详细的操作系统,明白,文件名是一个硬链接到实际的磁盘上的数据,因此每个文件必须至少有一个硬链接。因此,一个文件从磁盘将不会被删除,只要它有一个与之关联的硬链接。

这里我们有两个硬链接;也就是说,per雷竞技下载官网cona。rocks and new_hardlink having the same content (as they point to the same physical data).

使用这方面的知识,如果我们创建数据文件的硬链接(ibd),删除表不会真正从OS只删除删除文件的硬链接,这是非常的磁盘IO。

我们可以用以下步骤加快删除表。

步骤将MySQL的大桌子

假设我们有下降large_table

  • 在服务器上创建一个硬链接(需要权限提升)

  • 问题删除表

因为我们刚刚创建硬链接,删除表只会删除large_table.ibd链接。原始数据仍然存在,但MySQL是知道这剩下的。

  • 截断文件慢慢直到足够小

#你可以增加截断大小从1克到10到100年根据移动速度降低文件大小。

  • 执行rm命令

最好是确保表不查询,以避免“驱逐”的过程和MySQL遍历链表。

考虑你的复制环境,我建议您执行(被动)复制服务器上第一,紧随其后的是生产,事先有一个想法。你也可以执行该任务故障恢复:对副本>执行故障转移>旧主节点上执行。

风险:此方法加快旧的MySQL版本删除表,包括处理数据库文件操作系统级别和人为错误(像往常一样)将是灾难性的。

让我知道如何把这些巨大的表和如果这种方法吸引你。