我的表格Calls
包含3列:messageType
,callId
和lastModified
。
对于每次调用,DB中写入4行,每行一个。有4种类型的消息: CALL-SETUP , CALL-PROGRESS , CALL-START 和 CALL-STOP (代码4)。
列messageType
和callId
组成了主键。
我想删除以下行:
我使用了以下查询:
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。
由于
答案 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不喜欢大范围日期的日期索引。尝试使用脚本删除小批量。
祝你好运!