【发布时间】:2011-04-12 23:00:09
【问题描述】:
这是一个非常简单的问题。将数据插入表中通常工作正常,除了插入查询需要几秒钟的几次。 (我不试图批量插入数据。)所以我为插入过程设置了一个模拟,以找出为什么插入查询有时需要超过 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%) 顶部报告负载平均约 10 1 分钟(我们的数据库机器正常)
已使用 156k 交换空间(32 gigs 内存)
我不知道是什么导致了这种性能滞后。这不会发生在我们的低负载从属设备上,只会发生在我们的高负载主机上。这也发生在内存和 innodb 表中。有没有人有什么建议? (这是一个生产系统,所以没有什么异国情调!)
【问题讨论】:
-
其他表/数据库工作正常吗?可能有坏驱动器(system.log 中的任何 I/O 错误)?从 mysql 命令行查询需要多长时间? mysql mydb
-
不,我们在其他表上也有这个问题。我创建了一个示例表,然后将其倾倒在上面以查看发生了什么。如果我使用 mysql mydb
-
“同一行;100,000 次”是什么意思?你的意思是 single 插入需要 2 秒,还是相同的插入 100,000 次需要 2 秒?
-
我插入同一行,100,000 次。有时单次插入需要 2 秒或更长时间。当查询时间超过 2 秒时,插入 100,000 行只是在 20,000 次中找到 1 次。我会更新问题
标签: sql mysql performance query-cache