这是一个非常简单的问题。将数据插入表中通常工作正常,除了少数情况下插入查询需要几秒钟的时间。 (我是not尝试批量插入数据。)因此,我为插入过程设置了一个模拟,以找出为什么插入查询偶尔需要超过 2 秒才能运行。 Joshua建议索引文件可能正在调整;我删除了id(主键字段),但延迟仍然发生。
我有一个 MyISAM 表:daniel_test_insert
(此表开始完全地 empty):
create table if not exists daniel_test_insert (
id int unsigned auto_increment not null,
value_str varchar(255) not null default '',
value_int int unsigned default 0 not null,
primary key (id)
)
我将数据插入其中,有时插入查询需要超过 2 秒的时间才能运行。没有读取内容在此表上 - 仅由单线程程序串行写入。
我运行了完全相同的查询 100,000 次,以找出查询有时需要很长时间的原因。到目前为止,这似乎是一个随机事件。
例如,此查询花费了 4.194 秒(对于插入来说非常长的时间):
Query: INSERT INTO daniel_test_insert SET value_int=12345, value_str='afjdaldjsf aljsdfl ajsdfljadfjalsdj fajd as f' - ran for 4.194 seconds
status | duration | cpu_user | cpu_system | context_voluntary | context_involuntary | page_faults_minor
starting | 0.000042 | 0.000000 | 0.000000 | 0 | 0 | 0
checking permissions | 0.000024 | 0.000000 | 0.000000 | 0 | 0 | 0
Opening tables | 0.000024 | 0.001000 | 0.000000 | 0 | 0 | 0
System lock | 0.000022 | 0.000000 | 0.000000 | 0 | 0 | 0
Table lock | 0.000020 | 0.000000 | 0.000000 | 0 | 0 | 0
init | 0.000029 | 0.000000 | 0.000000 | 1 | 0 | 0
update | 4.067331 | 12.151152 | 5.298194 | 204894 | 18806 | 477995
end | 0.000094 | 0.000000 | 0.000000 | 8 | 0 | 0
query end | 0.000033 | 0.000000 | 0.000000 | 1 | 0 | 0
freeing items | 0.000030 | 0.000000 | 0.000000 | 1 | 0 | 0
closing tables | 0.125736 | 0.278958 | 0.072989 | 4294 | 604 | 2301
logging slow query | 0.000099 | 0.000000 | 0.000000 | 1 | 0 | 0
logging slow query | 0.000102 | 0.000000 | 0.000000 | 7 | 0 | 0
cleaning up | 0.000035 | 0.000000 | 0.000000 | 7 | 0 | 0
(这是 SHOW PROFILE 命令的缩写版本,我扔掉了全为零的列。)
现在,更新有数量惊人的上下文切换和轻微页面错误。此数据库上的 Opened_Tables 大约每 10 秒增加 1 个(未耗尽 table_cache 空间)
Stats:
MySQL 5.0.89
硬件:32 Gigs 内存/8 核 @ 2.66GHz; raid 10 SCSI 硬盘 (SCSI II???)
我已查询硬盘驱动器和 raid 控制器:没有报告错误。
CPU 大约有 50% 空闲。
iostat -x 5(报告硬盘利用率低于 10%)
顶部报告负载平均约为 10 持续 1 分钟(对于我们的数据库机器来说是正常的)
交换空间已使用 156k(32 GB 内存)
我不知道是什么导致了这种性能滞后。这种情况不会发生在我们的低负载从站上,只会发生在我们的高负载主站上。内存和 innodb 表也会发生这种情况。有没有人有什么建议? (这是一个生产系统,所以没有什么奇怪的!)