这是一个相当简单的问题。通常情况下,将数据插入表格中都能很顺利地进行,但有时会出现插入查询耗时几秒钟的情况。(我并不是在尝试批量插入数据。)因此,我设置了一个模拟插入过程来找出为什么插入查询偶尔需要超过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 GB RAM / 8核心 @ 2.66GHz;RAID 10 SCSI硬盘(SCSI II???)
已查询硬盘和RAID控制器:未报告任何错误。CPU约50%空闲。
iostat -x 5(显示硬盘利用率低于10%)
top报告负载平均值为1分钟的10个(对于我们的db机器而言正常)
交换空间已使用156k(32 GB RAM)
我无法找出是什么导致了性能滞后。这种情况在我们的低负载从属机上不会发生,只在我们的高负载主服务器上发生。内存和innodb表也会发生此问题。有人有什么建议吗?(这是一个生产系统,因此不要使用奇怪的方法!)