MSQL 状态“关闭表”花费的时间是进程的两倍

san*_*uda 5 mysql performance mysql-5.5

我有一个需要很长时间的删除查询。当我办理登机手续时,processlist该状态显示为“正在关闭的桌子”。关闭桌子需要很长时间。

示例:
我运行一个查询,总时间为1:42秒,其中80-90秒用于关闭表。

这发生在所有查询中,例如load data,selectinsert

以下是my.cnf设置:

key_buffer_size = 2G
sort_buffer_size = 8M
read_buffer_size = 10M
read_rnd_buffer_size = 10M
join_buffer_size = 2M
bulk_insert_buffer_size = 100M
myisam_sort_buffer_size = 64M

#tmp_table_size = 100M
#max_heap_table_size = 64M
#max_allowed_packet = 64M

table_cache=1024
Run Code Online (Sandbox Code Playgroud)


我的记忆信息

[root@localhost ~]# free -m
             total       used       free     shared    buffers     cached
Mem:          7862       6686       1175          0         11       4091
-/+ buffers/cache:       2583       5278
Swap:        15998         18      15980
Run Code Online (Sandbox Code Playgroud)


请告诉我需要在my.cnf文件中进行哪些更改?

Mah*_*til 4

关闭表此线程将更改的表数据刷新到磁盘并关闭使用的表。这应该是一个快速的操作。如果不是,您应该验证您的磁盘是否已满,并且该磁盘的使用率不是很高。

错误报告也可能相关。

更远,

在以下情况下,MySQL 会关闭未使用的表并将其从表缓存中删除:

  • 当缓存已满并且线程尝试打开不在缓存中的表时。
  • 当缓存包含多于 table_cache 条目并且缓存中的表不再被任何线程使用时。

  • 当发生表刷新操作时。当有人发出 FLUSH TABLES 语句或执行 mysqladmin flash-tables 或 mysqladmin refresh 命令时,就会发生这种情况。

您可以通过检查 mysqld 状态变量 Opened_tables 来确定您的表缓存是否太小,该变量指示自服务器启动以来的开表操作次数:

mysql> SHOW GLOBAL STATUS LIKE 'Opened_tables';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| Opened_tables | 2741  |
+---------------+-------+
Run Code Online (Sandbox Code Playgroud)

如果该值非常大或增加很快,即使您没有发出很多 FLUSH TABLES 语句,您也应该增加表缓存大小。有关详细信息,请参阅 MySQL 如何打开和关闭表:

http://dev.mysql.com/doc/refman/5.0/en/table-cache.html