一个大表是一个疼痛的原因很多,只要它是一个系统。如果这还不够,这也是一个艰巨的任务来摆脱它。在这篇文章中,我们将明白为什么这是一个痛苦做这个操作,我们能做什么。它会像要求表“告诉我发生了什么事,我将放松驱逐”。
那么发生了什么?年代trong>当一个表被删除(或截断),InnoDB扫描整个缓冲池页面和删除所有这些属于表。对于大型缓冲池,这爬在缓冲池页面和拆迁过程中会慢。当我们说“扫描缓冲池”,它主要是寻找“LRU”,“冲”(脏页),和“你好”条目。
LRU年代trong>:缓冲池页面存储在一个链表的页面的顺序使用。作为数据的列表,是驱逐新数据的空间。当房间需要添加一个新页面缓冲池,最近最少使用页面驱逐和添加到一个新的页面年代pan>列表的中间年代pan>。年代pan>
你好年代trong>:这是一个散列索引包含频繁访问的索引页。InnoDB搜索机制,监测指数。raybet雷竞技竞猜在线官网如果InnoDB通知,查询可以受益于构建一个散列索引,它自动。年代pan>
免责声明:年代pan>
这个问题我们会讨论<一个href="https://dev.mysql.com/worklog/task/?id=14100" target="_blank" rel="noopener">解决在MySQL 8.0.23一个>(开始)虽然这仍然是许多MySQL相关部署在低版本。从MySQL 8.0.23,删除表的过程已得到改进和MySQL不再等待驱逐。InnoDB实现一个懒惰驱逐过程各自的页面缓冲池。年代pan>
检查引擎INNODB样本状态如下:年代pan>
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20.
21
22
23
24
25
26
27
|
缓冲年代pan>
池<年代pan class="crayon-h">
和年代pan>
内存年代pan>
- - - - - - - - - - - - - - - - - - - - - - -
总<年代pan class="crayon-h">大<年代pan class="crayon-h">
内存年代pan>
分配<年代pan class="crayon-h">3576902451200
字典<年代pan class="crayon-h">
内存年代pan>
分配<年代pan class="crayon-h">5414868
内部<年代pan class="crayon-h">
哈希年代pan>
表年代pan>
(常数<年代pan class="crayon-h">因素<年代pan class="crayon-h">+<年代pan class="crayon-h">变量<年代pan class="crayon-h">因素)
自适应<年代pan class="crayon-h">
哈希年代pan>
指数年代pan>
419777277888<年代pan class="crayon-h">(54392761408<年代pan class="crayon-h">+<年代pan class="crayon-h">365384516480)
页面年代pan>
哈希年代pan>
53118808<年代pan class="crayon-h">(<年代pan class="crayon-e ">缓冲年代pan>
池<年代pan class="crayon-h">0<年代pan class="crayon-h">唯一的)
字典<年代pan class="crayon-h">缓存<年代pan class="crayon-h">13603605220<年代pan class="crayon-h">(13598190352<年代pan class="crayon-h">+<年代pan class="crayon-h">5414868)
文件年代pan>
系统<年代pan class="crayon-h">1374872<年代pan class="crayon-h">(812272<年代pan class="crayon-h">+<年代pan class="crayon-h">562600)
锁年代pan>
系统<年代pan class="crayon-h">9470361768<年代pan class="crayon-h">(9461541368<年代pan class="crayon-h">+<年代pan class="crayon-h">8820400)
复苏<年代pan class="crayon-h">系统<年代pan class="crayon-h">0<年代pan class="crayon-h">(0<年代pan class="crayon-h">+<年代pan class="crayon-h">0)
缓冲年代pan>
池<年代pan class="crayon-h">大小<年代pan class="crayon-h">209689600
缓冲年代pan>
池<年代pan class="crayon-h">的大小,<年代pan class="crayon-h">字节<年代pan class="crayon-h">3435554406400
免费的<年代pan class="crayon-h">缓冲区<年代pan class="crayon-h">16263年
数据库年代pan>
页面<年代pan class="crayon-h">187372028
老<年代pan class="crayon-h">
数据库年代pan>
页面<年代pan class="crayon-h">69165341
修改<年代pan class="crayon-h">db<年代pan class="crayon-h">页面<年代pan class="crayon-h">2323769
等待<年代pan class="crayon-h">
读取年代pan>
0
等待<年代pan class="crayon-h">写道:<年代pan class="crayon-h">LRU<年代pan class="crayon-h">0,<年代pan class="crayon-h">
冲洗年代pan>
列表年代pan>
0,<年代pan class="crayon-h">单<年代pan class="crayon-h">
页面年代pan>
0
页面<年代pan class="crayon-h">使<年代pan class="crayon-h">年轻的<年代pan class="crayon-h">1831432982,<年代pan class="crayon-h">
不年代pan>
年轻的<年代pan class="crayon-h">28737547535
0.00<年代pan class="crayon-h">扬斯<年代pan class="crayon-o">/年代pan>年代,<年代pan class="crayon-h">0.00<年代pan class="crayon-h">非<年代pan class="crayon-o">- - - - - -年代pan>扬斯<年代pan class="crayon-o">/年代pan>年代
页面<年代pan class="crayon-h">
读年代pan>
1655886985,<年代pan class="crayon-h">创建<年代pan class="crayon-h">633099435,<年代pan class="crayon-h">写<年代pan class="crayon-h">15361171213
0.00<年代pan class="crayon-h">
读取年代pan>
/年代pan>年代,<年代pan class="crayon-h">0.00<年代pan class="crayon-h">创建<年代pan class="crayon-o">/年代pan>年代,<年代pan class="crayon-h">0.00<年代pan class="crayon-h">写<年代pan class="crayon-o">/年代pan>年代
缓冲年代pan>
池<年代pan class="crayon-h">打击<年代pan class="crayon-h">率<年代pan class="crayon-h">1000年<年代pan class="crayon-h">/<年代pan class="crayon-h">1000年,<年代pan class="crayon-h">年轻的<年代pan class="crayon-o">- - - - - -年代pan>使<年代pan class="crayon-h">率<年代pan class="crayon-h">0<年代pan class="crayon-h">/<年代pan class="crayon-h">1000年<年代pan class="crayon-h">
不年代pan>
1<年代pan class="crayon-h">/<年代pan class="crayon-h">1000年
页面<年代pan class="crayon-h">
读年代pan>
之前<年代pan class="crayon-h">0.00<年代pan class="crayon-o">/年代pan>年代,<年代pan class="crayon-h">驱逐<年代pan class="crayon-h">没有<年代pan class="crayon-h">访问<年代pan class="crayon-h">0.00<年代pan class="crayon-o">/年代pan>年代,<年代pan class="crayon-h">随机<年代pan class="crayon-h">
读年代pan>
之前<年代pan class="crayon-h">0.00<年代pan class="crayon-o">/年代pan>年代
LRU<年代pan class="crayon-h">len:<年代pan class="crayon-h">187372028,<年代pan class="crayon-h">unzip_LRU<年代pan class="crayon-h">len:<年代pan class="crayon-h">0
我<年代pan class="crayon-o">/年代pan>O<年代pan class="crayon-h">
总和年代pan>[13760][7845824]:坏蛋,<年代pan class="crayon-h">解压缩<年代pan class="crayon-h">
总和年代pan>[0]:坏蛋[0]
|
注意“数据库页面”和“LRU len”,代表需要扫描的页面数。年代pan>
接下来,把球传递给底层操作系统删除该文件。根据多大文件和系统是多忙,IO操作是需要时间的。年代pan>
一般来说,成本为drop table操作演习到以下两个任务:年代pan>
- 遍历缓冲池和驱逐的页面找到年代pan>
- 从操作系统磁盘删除文件年代pan>
两个任务一是mysql,任务是依赖操作系统(磁盘)。我们将在这两个方面寻找改善的过程。年代pan>
1。遍历缓冲池和驱逐的页面找到
看看我们可以找出方法来提高性能的任务。年代pan>
想法一:缓冲池很大,所以是链表;我们可以暂时减少缓冲池和链表小吗?年代pan>
的步骤是:年代pan>
保存当前的缓冲池状态>减少缓冲池大小>删除表(扫描小列表)>重置缓冲池大小>恢复缓冲池的内容年代pan>
|
1
2
3
4
5
6
7
|
集全球年代pan>
innodb_buffer_pool_dump_now<年代pan class="crayon-o">=年代pan>
在年代pan>;
显示年代pan>
状态年代pan>
就像年代pan>
“Innodb_buffer_pool_dump_status”年代pan>;
集全球年代pan>
通过innodb_buffer_pool_size<年代pan class="crayon-o">=年代pan>128米;
下降年代pan>
表年代pan>
LARGE_TABLE;
集全球年代pan>
通过innodb_buffer_pool_size<年代pan class="crayon-o">=年代pan>1 t;
集全球年代pan>
innodb_buffer_pool_load_now<年代pan class="crayon-o">=年代pan>
在年代pan>;
显示年代pan>
状态年代pan>
就像年代pan>
“Innodb_buffer_pool_dump_status”年代pan>;
|
听起来很简单,但它不工作;实际上,这让情况变得更糟,因为以下的原因。年代pan>
- 缓冲池大小是一个阻塞操作,它将仍然需要扫描列表,整理和调整缓冲池。年代pan>
- 减少交通运行缓冲池的性能损失。年代pan>
- 相同的阻塞操作将重复在缓冲池扩展。年代pan>
参考:年代pan>https://dev.mysql.com/doc/refman/5.7/en/innodb-buffer-pool-resize.html年代pan>
想法二:停止使用的表(没有选择,没有写在桌子上需要删除)年代pan>
- 可以避免表操作的撤销授予用户在桌子上或在应用程序级别控制读/写。年代pan>
- 这将导致缓冲池慢慢驱逐页面根据MySQL是多忙。年代pan>
- 拆迁过程将有所缓解,遍历整个链表,它不会找到任何相关页表。年代pan>
- 说,你仍将扫描链表。年代pan>
总之MySQL级别,你不能避免遍历链表缓冲池的但是你可以节省一些时间等待拆迁过程,让缓冲池最终驱逐的。年代pan>
2。删除文件从磁盘操作系统
现在,这个任务取决于和快速磁盘有多忙。文件删除操作,越慢越需要MySQL返回“删除成功”。年代pan>所以我们能做什么来改善这个删除操作吗?让我们来看看。年代pan>
想法一:较小的磁盘上的文件,就会越快。年代pan>
我们可以清除较小的磁盘上的数据的数据表。这是我们可以使用pt-archiver做。说,表会变得支离破碎,规模仍将保持不变,除非一个优化表或一个虚拟的改变(alter table…引擎= InnoDB)执行。年代pan>
使用pt-archiver慢慢删除表记录>降低表大小>给LRU算法时间驱逐这些页面从缓冲池>下降年代pan>
这种方法涉及多个活动需要更多的时间作为存档流程之后,冷却时间可能需要更长的时间基于表的大小。现在注意,对于较大的表,pt-archiver会花很长时间。年代pan>我们仍将有一个支离破碎的表有一个很大的表大小的磁盘上,直到我们运行一个虚拟的改变。年代pan>
想法二:不删除底层表空间文件(ibd)年代pan>
如果我们完全跳过文件删除操作?MySQL将返回命令一旦缓冲池扫描完成!但我们可以吗?年代pan>
是的,部分是的。我们可以使用一个硬链接“傻瓜”MySQL相信表的数据文件被删除了,尽管它仍然存在!年代pan>
硬链接是什么?
(你可以跳过这一部分如果你已经意识到这一概念)年代pan>
硬链接是一个目录条目,将一个名称与文件。每一个文件名,你看到的是一个硬链接。让我们来探讨:年代pan>
|
1
2
3
4
|
苹果笔记本电脑年代pan>
- - - - - -年代pan>
箴年代pan>
:年代pan>
~年代pan>
kedarvaijanapurkar年代pan>
美元年代pan>
触摸年代pan>
雷竞技下载官网
.rocks年代pan>
苹果笔记本电脑年代pan>
- - - - - -年代pan>
箴年代pan>
:年代pan>
~年代pan>
kedarvaijanapurkar年代pan>
美元年代pan>
回声年代pan>
“测试”年代pan>
>年代pan>
雷竞技下载官网
.rocks年代pan>
苹果笔记本电脑年代pan>
- - - - - -年代pan>
箴年代pan>
:年代pan>
~年代pan>
kedarvaijanapurkar年代pan>
美元年代pan>
ls年代pan>
- - - - - -年代pan>
李年代pan>
雷竞技下载官网
.rocks年代pan>
20594511年代pan>
- - - - - -年代pan>
rw年代pan>
- - - - - -年代pan>
r年代pan>
- - -年代pan>
r年代pan>
- - -年代pan>
1年代pan>
kedarvaijanapurkar年代pan>
工作人员年代pan>
5年代pan>
8月年代pan>
26年代pan>
16年代pan>
:年代pan>
22年代pan>
雷竞技下载官网
.rocks年代pan>
|
这里“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.年代pan>
|
1
2
3
4
5
|
苹果笔记本电脑年代pan>
- - - - - -年代pan>
箴年代pan>
:年代pan>
~年代pan>
kedarvaijanapurkar年代pan>
美元年代pan>
ln年代pan>
雷竞技下载官网
.rocks年代pan>
new_hardlink年代pan>
苹果笔记本电脑年代pan>
- - - - - -年代pan>
箴年代pan>
:年代pan>
~年代pan>
kedarvaijanapurkar年代pan>
美元年代pan>
ls年代pan>
- - - - - -年代pan>
李年代pan>
*年代pan>
hardlink年代pan>
*年代pan>
20594511年代pan>
- - - - - -年代pan>
rw年代pan>
- - - - - -年代pan>
r年代pan>
- - -年代pan>
r年代pan>
- - -年代pan>
2年代pan>
kedarvaijanapurkar年代pan>
工作人员年代pan>
5年代pan>
8月年代pan>
26年代pan>
16年代pan>
:年代pan>
22年代pan>
雷竞技下载官网
.rocks年代pan>
20594511年代pan>
- - - - - -年代pan>
rw年代pan>
- - - - - -年代pan>
r年代pan>
- - -年代pan>
r年代pan>
- - -年代pan>
2年代pan>
kedarvaijanapurkar年代pan>
工作人员年代pan>
5年代pan>
8月年代pan>
26年代pan>
16年代pan>
:年代pan>
22年代pan>
new_hardlink年代pan>
苹果笔记本电脑年代pan>
- - - - - -年代pan>
箴年代pan>
:年代pan>
~年代pan>
kedarvaijanapurkar年代pan>
美元年代pan>
|
注意,我们可以看到两个不同的文件但是inode还是相同的“20594511”,指向同一个物理位置/文件。年代pan>
没有进入更详细的操作系统,明白,文件名是一个硬链接到实际的磁盘上的数据,因此每个文件必须至少有一个硬链接。因此,一个文件从磁盘将不会被删除,只要它有一个与之关联的硬链接。年代pan>
这里我们有两个硬链接;也就是说,per雷竞技下载官网cona。rocks and new_hardlink having the same content (as they point to the same physical data).年代pan>
|
1
2
3
4
5
|
苹果笔记本电脑年代pan>
- - - - - -年代pan>
箴年代pan>
:年代pan>
~年代pan>
kedarvaijanapurkar年代pan>
美元年代pan>
猫年代pan>
雷竞技下载官网
.rocks年代pan>
雷竞技下载官网
是年代pan>
伟大的年代pan>
和年代pan>
hardlink年代pan>
是年代pan>
一个年代pan>
有趣的年代pan>
概念年代pan>
。年代pan>
苹果笔记本电脑年代pan>
- - - - - -年代pan>
箴年代pan>
:年代pan>
~年代pan>
kedarvaijanapurkar年代pan>
美元年代pan>
猫年代pan>
new_hardlink年代pan>
雷竞技下载官网
是年代pan>
伟大的年代pan>
和年代pan>
hardlink年代pan>
是年代pan>
一个年代pan>
有趣的年代pan>
概念年代pan>
。年代pan>
苹果笔记本电脑年代pan>
- - - - - -年代pan>
箴年代pan>
:年代pan>
~年代pan>
kedarvaijanapurkar年代pan>
美元年代pan>
|
使用这方面的知识,如果我们创建数据文件的硬链接(ibd),删除表不会真正从OS只删除删除文件的硬链接,这是非常的磁盘IO。年代pan>
我们可以用以下步骤加快删除表。年代pan>
步骤将MySQL的大桌子
假设我们有下降年代pan>large_table年代pan>。年代pan>
- 在服务器上创建一个硬链接(需要权限提升)年代pan>
|
1
2
|
cd年代pan>
<年代pan>
datadir年代pan>
>年代pan>
/年代pan>
<年代pan>
数据库年代pan>
>年代pan>
ln年代pan>
large_table年代pan>
.ibd年代pan>
large_table年代pan>
.ibd年代pan>
.hardlink年代pan>
|
- 问题删除表年代pan>
|
1
2
|
集年代pan>
SQL_LOG_BIN年代pan>
=年代pan>
0年代pan>
;年代pan>
下降年代pan>
表年代pan>
如果年代pan>
存在年代pan>
large_table年代pan>
;年代pan>
|
因为我们刚刚创建硬链接,删除表只会删除年代pan>large_table.ibd年代pan>链接。原始数据仍然存在,但MySQL是知道这剩下的。年代pan>
- 截断文件慢慢直到足够小年代pan>
|
1
2
|
cd年代pan>
<年代pan>
datadir年代pan>
>年代pan>
/年代pan>
<年代pan>
数据库年代pan>
>年代pan>
截断年代pan>
- - - - - -年代pan>
年代年代pan>
- - - - - -年代pan>
1 gb年代pan>
large_table年代pan>
.ibd年代pan>
.hardlink年代pan>
|
#你可以增加截断大小从1克到10到100年根据移动速度降低文件大小。年代pan>
- 执行rm命令年代pan>
|
1
|
rm年代pan>
large_table年代pan>
.ibd年代pan>
.hardlink年代pan>
|
最好是确保表不查询,以避免“驱逐”的过程和MySQL遍历链表。年代pan>
考虑你的复制环境,我建议您执行(被动)复制服务器上第一,紧随其后的是生产,事先有一个想法。你也可以执行该任务故障恢复:对副本>执行故障转移>旧主节点上执行。年代pan>
风险年代trong>:此方法加快旧的MySQL版本删除表,包括处理数据库文件操作系统级别和人为错误(像往常一样)将是灾难性的。年代pan>
让我知道如何把这些巨大的表和如果这种方法吸引你。年代pan>






伟大的博客,棚先生,非常有用的,当你需要把一个巨大的表