这是一个非常简单的问题。将数据插入表中通常工作正常,除了插入查询需要几秒钟的几次。(我不是要批量插入数据。)所以我为插入过程设置了一个模拟,以找出为什么插入查询有时需要超过 2 秒才能运行。Joshua 建议索引文件可能正在调整;我删除了 id (主键字段),但延迟仍然发生。
我有一个 MyISAM 表:(daniel_test_insert
这个表开始完全是空的):
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 空间)
统计:
MySQL 5.0.89
硬件:32 Gigs 内存 / 8 核 @ 2.66GHz;突袭 10 个 SCSI 硬盘(SCSI II ???)
我已经询问了硬盘驱动器和 RAID 控制器:没有报告错误。CPU 大约有 50% 空闲。
iostat -x 5(报告硬盘利用率低于 10%) top 报告负载平均约 10 1 分钟(我们的数据库机器正常)
交换空间已使用 156k(32 gigs ram)
我不知道是什么导致了这种性能滞后。这不会发生在我们的低负载从属设备上,只会发生在我们的高负载主机上。这也发生在内存和 innodb 表中。有没有人有什么建议?(这是一个生产系统,所以没有什么异国情调!)