如何“清理”mysql information_schema?

时间:2015-01-09 12:26:56

标签: mysql

我有一个包含数万个表的数据库。结果,mysql information_schema变得非常慢,通过影响表的打开和关闭时间等因素来影响整体性能。

由于所有表都是Myisam并且在mysql数据目录中有相应的文件,我只是将一堆表文件移动到另一个数据库。

这没有问题,但是,原始数据库中的information_schema的性能没有太大提高:

mysql> select count(*) from information_schema.TABLES where table_schema='database_1';
+----------+
| count(*) |
+----------+
|    17374 |
+----------+
1 row in set (1 min 28.68 sec)

与新数据库相比:

mysql> select count(*) from information_schema.TABLES where table_schema='database_2';
+----------+
| count(*) |
+----------+
|    16127 |
+----------+
1 row in set (2.15 sec)

似乎有些东西"必须留在information_schema中。

有谁知道导致这种情况的原因是什么,以及是否可以采取任何措施?

1 个答案:

答案 0 :(得分:1)

造成性能损失的原因是磁盘IO。

information_schema实现寻找磁盘上的每个*.FRM文件,以查找表。

最近打开文件时,文件实际上已经在内存中,并且没有真正的磁盘完成,这导致快速查询。

当文件最近没有被打开或已经被逐出时,文件io会导致磁盘io,这非常慢。

鉴于表的数量很多,加速information_schema查询本身并没有多少工作要做。更好的改进是减少访问information_schema的查询数量。

如果架构稳定,请考虑将information_schema的副本复制到实际表中,然后查询副本。