0

我有一个Calls包含 3 列的表messageTypecallIdlastModified

对于每次调用,在 DB 中写入 4 行,每条消息一个。有 4 种类型的消息:CALL-SETUPCALL-PROGRESSCALL-STARTCALL-STOP(代码 4)。

messageTypecallId组成主键。

我想删除以下行:

  • 对应于终止呼叫的行。当 CALL-STOP 消息已写入 DB 时,呼叫终止。
  • 自 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);

我只使用这个语句来清理表。但是,与此同时,大文件(大约 30000 行)使用 也非常频繁地(例如每秒)填充该表LOAD DATA INFILE,我确实看到了仅加载数据和加载数据 + 清洁之间的性能差异。

我可以做些什么来提高性能?关于 SQL DELETE?在数据库本身?

我确切地说我使用MySQL。

谢谢

4

1 回答 1

0

给你几个想法:

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

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

(因此您只会获得一个 ID,无需区分它们)。

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

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

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

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

祝你好运!

于 2012-09-10T21:00:59.843 回答