MySQL简单插入查询在“查询结束”步骤慢

时间:2013-08-22 01:14:40

标签: mysql sql performance profiling

我正在尝试虚拟化我的percona服务器5.5.32-31.0并且看到奇怪的东西。在虚拟化框中,插入(实际上所有)查询都很慢,但这是查询的“查询结束”步骤,它会消除响应时间。

让我退后一步,这是我的测试表:

CREATE TABLE `mysql_io_test` (
  `id` int(11) NOT NULL,
  `time_diff` char(8) COLLATE utf8mb4_unicode_ci NOT NULL,
  `data` char(100) COLLATE utf8mb4_unicode_ci NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci

运行此:

set profiling = 1;
insert into util.mysql_io_test select 999, '99:99:99', 'ABCDEFGHIJ';
set profiling = 0;

我明白了:

starting, 0.000031
checking permissions, 0.000005
Opening tables, 0.000530
System lock, 0.000008
init, 0.000008
optimizing, 0.000002
executing, 0.000095
end, 0.000005
query end, 0.067226
closing tables, 0.000013
freeing items, 0.000039
logging slow query, 0.000002
cleaning up, 0.000005

在未虚拟化的盒子上(使用较旧的数据库:v5.5.27-28.1)我得到了更合理的信息:

starting, 0.000039
checking permissions, 0.000004
Opening tables, 0.000013
System lock, 0.000009
init, 0.000008
optimizing, 0.000002
executing, 0.000038
end, 0.000003
query end, 0.000143
closing tables, 0.000008
freeing items, 0.000018
logging slow query, 0.000001
cleaning up, 0.000002

我不是很熟悉这些步骤的真正意义,但我真的不知道为什么“查询结束”会很慢。手册(http://dev.mysql.com/doc/refman/5.5/en/general-thread-states.html)没有提供更多信息。我会尝试回到旧版本并明天挖掘代码,但我想有人可能已经看过这个,并且可能能够为我揭开这个谜团的一些亮点。

其他一些可能有用的东西:

  • 虚拟机运行在与旧版本一样强大的盒子上,两者都是中等范围
  • 现在框中正在运行其他6个虚拟机
  • 此服务器通常比旧服务器慢
  • 新服务器上的几个大负载测试非常糟糕,但最近的一个测试实际上比旧服务器更快。所以我不能说这个'查询结束'问题一直在发生;虽然自上次大型测试后配置发生了变化。

1 个答案:

答案 0 :(得分:0)

对于遇到这种情况的任何其他人,我想我已经跟踪了这个问题。我已将innodb_flush_method从常规框中的ALL_O_DIRECT更改为VM上的O_DIRECT,因为mysql正在发出此警告:

kernel: EXT4-fs (vdb1): Unaligned AIO/DIO on inode 17565314 by mysqld; performance will be poor.

恢复到ALL_O_DIRECT会使警告重新开始显示 - 但在“查询结束”步骤中我的表现要好100倍,所以我现在要继续使用它。

我希望这可以帮助遇到同样问题的其他人。