并发LOAD DATA INFILE和DELETE

时间:2012-09-09 14:29:39

标签: mysql performance load-data-infile

我的表格Calls包含3列:messageTypecallIdlastModified

对于每次调用,DB中写入4行,每行一个。有4种类型的消息: CALL-SETUP CALL-PROGRESS CALL-START CALL-STOP (代码4)。

messageTypecallId组成了主键。

我想删除以下行:

  • 与终止呼叫相对应的行。在CALL中写入CALL-STOP消息后,将终止呼叫。
  • 自4小时以来尚未修改的行(例如)。

我使用了以下查询:

DELETE FROM Calls WHERE callId IN (SELECT * FROM (SELECT DISTINCT callId FROM Calls WHERE messageType=4 OR TIMESTAMPDIFF(SECOND,lastModified,NOW()) > 14400) AS tmp);

我只使用此语句来清理表。但是,与此同时,使用LOAD DATA INFILE的大文件(大约30000行)也经常(例如每秒)填充表格,我真的看到仅加载数据和加载之间的性能差异数据+干净。

我可以做些什么来提高性能?在SQL DELETE上?在DB本身?

我确切地说我使用MySQL。

由于

1 个答案:

答案 0 :(得分:0)

有几个想法:

1)我真的很讨厌DISTINCT。每个调用只有一个messageType为4吗?如果是这样,您将使用DISTINCT作为OR子句的修改部分。怎么样:

 WHERE messageType = 4
 OR (messageType = 1 and lastModified < datesub(now(), interval 4 hour)

(所以你只能获得一个ID,而且不需要DISTINCT)。

2)不要在日期列上运行公式 - 引擎无法使用索引!请参阅上面的WHERE子句,将公式移动到另一侧,它可以使用索引,并且可以缓存常量值。

3)你没有描述你的索引,但是你可能想要一个复合索引(lastModified,messageType,callId)。

4)正如其他人所说,发动机的选择确实很重要。 myisam锁定了一切。试试innodb。

5)有时MySQL不喜欢大范围日期的日期索引。尝试使用脚本删除小批量。

祝你好运!