Php 频繁截断、更新的MySQL表;挑选

Php 频繁截断、更新的MySQL表;挑选,php,mysql,Php,Mysql,我正在构建一个应用程序,它要求每分钟清空一个MySQL表并用新数据重新填充。同时,预计该表将持续每秒接收10-15条SELECT语句。SELECT语句通常应该非常快(每次选择10-50个中等长度的字符串)。有几件事我很担心: 在TRUNCATE和UPDATE查询之间是否有可能运行SELECT查询以返回0行?执行TRUNCATE-UPDATE查询对时是否需要锁定表 关于此设置,我是否应该担心任何重大的性能问题?为什么需要每分钟截断一次?是,这将导致您的用户没有返回任何行。只需更新行,而不是截断和插

我正在构建一个应用程序,它要求每分钟清空一个MySQL表并用新数据重新填充。同时,预计该表将持续每秒接收10-15条SELECT语句。SELECT语句通常应该非常快(每次选择10-50个中等长度的字符串)。有几件事我很担心:

在TRUNCATE和UPDATE查询之间是否有可能运行SELECT查询以返回0行?执行TRUNCATE-UPDATE查询对时是否需要锁定表


关于此设置,我是否应该担心任何重大的性能问题?

为什么需要每分钟截断一次?是,这将导致您的用户没有返回任何行。只需更新行,而不是截断和插入

第二个选项是将新值插入到新表中,将两个表重命名为:

RENAME TABLE tbl_name TO new_tbl_name
[, tbl_name2 TO new_tbl_name2]
然后截断旧表


然后,您的用户将看到零停机时间。另一个答案中的截断忽略事务并立即发生,因此不要这样做

为什么每分钟都要截断它?是,这将导致您的用户没有返回任何行。只需更新行,而不是截断和插入

第二个选项是将新值插入到新表中,将两个表重命名为:

RENAME TABLE tbl_name TO new_tbl_name
[, tbl_name2 TO new_tbl_name2]
然后截断旧表


然后,您的用户将看到零停机时间。另一个答案中的截断忽略事务并立即发生,因此不要这样做

很可能有更好的方法来实现你的目标。但是,对于您的问题,这里有一个可能的答案:您可以封装要在事务中一起执行的查询。在我的脑海里,就像

BEGIN TRANSACTION;
TRUNCATE foo;
INSERT INTO foo ...;
COMMIT;
编辑:以上部分完全错误,请参见Philip Devine的评论。谢谢。


关于性能问题:重复连接到服务器可能代价高昂。如果你有一个持久的连接,你应该很好。通过在批处理中执行多个查询或使用准备好的语句,您可以在这里或那里节省一些钱。

很可能有更好的方法来实现您的目标。但是,对于您的问题,这里有一个可能的答案:您可以封装要在事务中一起执行的查询。在我的脑海里,就像

BEGIN TRANSACTION;
TRUNCATE foo;
INSERT INTO foo ...;
COMMIT;
编辑:以上部分完全错误,请参见Philip Devine的评论。谢谢。



关于性能问题:重复连接到服务器可能代价高昂。如果你有一个持久的连接,你应该很好。通过在批处理中执行多个查询或使用准备好的语句,您可以在这里或那里节省一些信息。

这种设置看起来很糟糕-总体情况如何?您认为您正在构建一个应用程序,需要每分钟清空一个MySQL表并重新填充新数据。您最终无法描述正在发生的事情的高级业务语言吗?发生这种事的时间是多少?是否需要保留这些数据?你能展示一个模拟的表格模式吗?那些执行插入的进程,可以被阻止几秒钟吗?是否有一个消费过程,显然决定了一些事情,比如
嘿,我得到了最后一个错误,处理了它,现在让我们清空那些
。。。所写的概念相当模糊,这听起来像是一个错误。你为什么要这样做?我最终解决了这个问题,没有截断表。我只是用一个md5散列id使用REPLACE-INTO,一旦更新了表,就删除旧数据。这样的设置看起来很糟糕-有什么大不了的?你认为你在构建一个应用程序,需要每分钟清空一个MySQL表并用新数据重新填充。您最终无法描述正在发生的事情的高级业务语言吗?发生这种事的时间是多少?是否需要保留这些数据?你能展示一个模拟的表格模式吗?那些执行插入的进程,可以被阻止几秒钟吗?是否有一个消费过程,显然决定了一些事情,比如
嘿,我得到了最后一个错误,处理了它,现在让我们清空那些
。。。所写的概念相当模糊,这听起来像是一个错误。你为什么要这样做?我最终解决了这个问题,没有截断表。我只是用一个md5散列id使用REPLACE-INTO,一旦表被更新,就删除旧数据。这是一个注释,而不是一个答案,它回答了op中的问题“是否有可能在TRUNCATE和UPDATE查询之间运行SELECT查询以返回0行?”我提供了一个解决方案。仔细阅读。这违反了神圣的协议,你会因此被打屁股。如何使用数据重命名jive并将其放入一个不再存在的表中?好的,然后继续否决唯一正确回答问题的答案。这是一条评论,而不是回答否,这是对op中问题的回答“是否有可能在TRUNCATE和UPDATE查询之间运行SELECT查询以返回0行?“我提供了一个解决方案。仔细阅读。这违反了神圣的协议,你会因此被打屁股。数据进入一个不再存在的表如何重命名jive确定然后继续向下投票唯一正确解决问题的答案。不要这样做!截断总是立即完成,因为它是ddl而不是dml!不要这样做这!截断总是立即完成,因为它是ddl而不是dml!