【发布时间】:2012-02-12 16:09:51
【问题描述】:
我有一个每天晚上都会更新的事件数据库。单个事件具有跨三个(或更多)表的信息。最近更新量导致我的 MySQL 引擎非常慢,以至于在插入新事件时我的其他查询被冻结。为了加快速度,我想进行一系列批处理查询,而不是单独执行每个查询,我觉得这是开销的很大一部分。
问题是因为数据分布在多个表中,这是我插入单个事件所要做的:
(in Mysql) INSERT INTO 'locations' (...) VALUES (...) ON DUPLICATE KEY UPDATE ...
(in php get the last inserted id into variable $locationID)
(in Mysql) INSERT INTO 'event_info' (...) VALUES ($locationID, ...) ON DUPLICATE KEY UPDATE...
(in php get the last inserted id into variable $eventID)
(in Mysql) INSERT INTO 'event_times' (...) VALUES ($eventID, ...) ON DUPLICATE KEY UPDATE...
我不是在设计表格时寻求帮助,但正如您所见,插入单个事件至少需要三个插入 每个插入都取决于从前一个中获取 id。这就是为什么我不知道从哪里开始将其变成批处理请求的原因。将这个过程设计成批处理请求的任何帮助都会很棒,谢谢!
编辑:我之前可能已经有位置或事件信息,这就是为什么 ON DUPLICATE KEY UPDATE 部分在那里,如果它已经在数据库中,我会得到旧的 id。直到插入我才知道它是新数据还是数据库中已经存在。 (因为除非我有误解,否则我不能做预先分配 id 的事情,因为这每次都会假设一个新的 id。)
【问题讨论】:
-
您使用的是什么数据库引擎?请记住,MyISAM 会为每次插入锁定表。
-
这是 MyISAM,但其他被冻结的查询将转到一个完全不同的表,而不是这会影响的表,所以我认为这只是所有插入和索引更新的整体压力。
标签: php mysql performance batch-processing