我有一个包含数万个表的数据库。结果,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中。
有谁知道导致这种情况的原因是什么,以及是否可以采取任何措施?
答案 0 :(得分:1)
造成性能损失的原因是磁盘IO。
information_schema
实现寻找磁盘上的每个*.FRM
文件,以查找表。
最近打开文件时,文件实际上已经在内存中,并且没有真正的磁盘完成,这导致快速查询。
当文件最近没有被打开或已经被逐出时,文件io会导致磁盘io,这非常慢。
鉴于表的数量很多,加速information_schema查询本身并没有多少工作要做。更好的改进是减少访问information_schema的查询数量。
如果架构稳定,请考虑将information_schema的副本复制到实际表中,然后查询副本。