2008-12-01 47 views
0

是否有可能在php脚本中执行简单的count(*)查询,而另一个php脚本正在执行insert ... select ... query?是否有可能做插入计数(*)...选择... mysql/php中的查询?

这种情况是,我需要创建一个表,其他表中有〜1M或更多的行,并且在插入时,我不希望用户感觉页面冻结,所以我试图更新计数,但是在插入背景时通过使用表中的select count(*),直到插入完成后,我才得到0。

那么有什么办法可以先问MySQL返回部分结果?还是有一种快速的方法来执行一系列插入数据,从先前的选择查询中获取数据,同时具有与insert ... select ... query相同的性能?

环境是php4.3和MySQL4.1。

回答

0

如果您正在执行单个INSERT ... SELECT,那么不会,您将无法获得中间结果。事实上,这将是一件不好的事情,因为用户永远不应该看到处于中间状态的数据库只显示语句或事务的部分结果。欲了解更多信息,请阅读ACID合规性。

也就是说,MyISAM引擎可能会因此而快速松动。我非常肯定,我已经看到MyISAM提交了一些但不是来自INSERT ... SELECT的所有行,当我中止它的一部分时。不过,你还没有说过你的表使用了哪个引擎。

0

其他用户在提交之前无法看到插入。这通常是一件好事,因为它确保他们看不到半数的数据。但是,如果您希望他们查看中间数据,则可以在插入时引发偶然性调用以“提交”。

顺便说一句 - 不要让任何人告诉你打开自动提交。这是一个巨大的时间浪费。我在我的数据库上有一个“删除并重新插入”的作业,当我关闭自动提交时,只需要1/3的时间。

3

不降低性能?不见得。有一点性能损失,也许...

但是,为什么你经常创建表并插入数百万行?如果你很少这样做,你不能只是警告管理员(大概是唯一允许做这种事的人),这需要很长时间。如果你一直在做,你真的确定你没有这么做吗错了

0

要明确一点,MySQL 4默认情况下未配置为使用事务。如果我没有记错的话,它使用MyISAM表类型来锁定每个插入的整个表。

最好的办法是使用其中一个MySQL批量插入功能,例如LOAD DATA INFILE,因为插入大量数据的速度会显着加快。至于计数,您可以将插入物分成N组(1000或1000),然后将进度计分成N个部分,并根据每个组的请求进行更新。

编辑:要考虑的另一件事是,如果这是模板的静态数据,那么您可以使用“select into”来创建一个具有相同数据的新表。不知道你的应用程序是什么,或者预期的功能,但是这也可以。

+0

LOAD DATA INFILE从OP获取文件中的数据,而不是另一个表中的SELECT。在加载之前,必须将该SELECT的结果复制到临时文件中。这与目前的解决方案相比可能没有任何改进。 – 2008-12-01 18:05:40

2

我同意斯坦的意见,如果您在PHP请求期间一次拷贝100万行,这是一个红旗。

我相信在大多数人们试图微观优化SQL的情况下,他们可以通过以不同方式接近问题来获得更高的性能和吞吐量。 SQL不应该是你的瓶颈。

0

如果您可以访问控制台,您可以询问各种状态问题,这些问题会提供您正在查找的信息。有一个类似“SHOW processlist”的命令。

相关问题