随机 InnoDB INSERT 超慢

Random InnoDB INSERTs super slow

我有以下 INSERT 语句:

cursor.execute('''UPDATE alg SET size=%(size)s, path=%(path)s, 
                  last_modified=%(last_modified)s, search_terms=%
                  WHERE objectID=%(objectID)s''', data)

它被编入索引,通常需要 1/1000 秒才能完成。但是,每 200 次 INSERT 左右执行一次,需要超长的时间。这是一个定时的例子 --

453
0.000407934188843
454
0.29783987999 <-- this one
455
0.000342130661011
456
0.000318765640259
457
0.000240087509155

该列已编入索引并且正在使用 InnoDB。知道问题可能是什么吗?它似乎也是随机的,因为如果我 运行 一遍又一遍,不同的对象会导致 INSERT 变慢——它与任何特定对象无关。

另请注意,我在 MyISAM 上没有这个问题。

您可能有默认值 innodb_log_file_size,它的 ID 为 5 兆字节。在您的 cnf 文件中将其设置为 128M 的最小值或 innodb_buffer_pool_size 的 25%。您会希望缓冲池对您的系统来说尽可能大。如果它是专用 mysql 服务器,那么 70-80% 的系统 RAM 不会不合理(为 OS 页面缓存留出一些)。

将日志文件大小设置得更大会 space 需要将内容刷新到表中的时间。设置太大会增加重启时的崩溃恢复时间。

还要确保设置 innodb_flush_method=O_DIRECT 以避免 OS 级页面缓存。