我正在构建一个应用程序,该应用程序需要清空MySQL表,并每分钟使用新数据重新填充。同时,预计该表将不断接收每秒10-15条SELECT语句。SELECT语句通常应该非常快(每次选择10-50个中等长度的字符串)。以下是我担心的几件事:
是否有可能在TRUNCATE和UPDATE查询之间运行SELECT查询,从而返回0行?在执行TRUNCATE-UPDATE查询对时,是否需要锁定表?
关于这个设置,有没有什么我应该担心的重要的性能问题?
发布于 2015-06-19 06:56:28
最有可能的是有一个更好的方法来实现你的目标。但是,对于您的问题,这里有一个可能的答案:您可以封装要在一个事务中一起执行的查询。从我脑海中浮现出来的东西
BEGIN TRANSACTION;
TRUNCATE foo;
INSERT INTO foo ...;
COMMIT;编辑:上面的部分是完全错误的,请参阅Philip Devine的评论。谢谢。
关于性能问题:重复连接到服务器的成本可能很高。如果你有一个持久的连接,你应该没问题。通过在批处理中执行多个查询或使用准备好的语句,您可以在这里和那里节省一些资源。
发布于 2015-06-19 06:52:31
为什么你每分钟都要截断它呢?是的,这将导致您的用户没有返回任何行。只需更新行,而不是截断和插入。
第二种选择是将新值插入到新表中,将这两个表重命名为:
RENAME TABLE tbl_name TO new_tbl_name
[, tbl_name2 TO new_tbl_name2]然后截断旧的表。
这样,您的用户就可以看到零停机时间。另一个答案中的截断忽略了事务,并立即发生,所以不要这样做!
https://stackoverflow.com/questions/30927109
复制相似问题