使用PHP / MYSQL我试图为我的网站创建一个简单的搜索。我在mytable
中拥有所有页面数据,并按此顺序处理数千行:
1. Query for 1 row with a particular id in `mytable` with column `status=0`
2. Using that id do something in `other` table(s)
3. When done, update `mytable` with`status=1`
已编辑
在步骤2中,我处理来自步骤1的所有数据,例如
为了加快进程,我想运行多个脚本以便我可以更快地处理所有行,然后我开始了解并发问题。我读了Mysql TRANSACTION
,这个过程是TRANSACTION
的典型例子。
对于记录,所有表格均为INNODB
,以便我可以使用TRANSACTION / LOCK
。如果我使用TRANSACTION
,那么问题是每个脚本都会等待一个完整的行进程(第2步需要更长时间),然后该进程需要同样的时间,因为只有一行处理1行!
有人可以建议,我如何继续使用TRANSACTION
OR LOCK
或其他一些表结构的其他替代方法,以便我可以通过运行更快/同时处理mytable
中的每个ROW同一个PHP脚本多次在一起?
我已经尝试了SOLR
,LUCENE
和SPHINX
并且很抱歉,但是对我来说,所有技术都太技术了,对不起我的这个限制:(。
答案 0 :(得分:2)
您可以将transaction_isolation
级别设置为READ UNCOMMITTED
以最小化锁定。在php脚本中将它设置在会话级别。
InnoDB默认具有REPEATABLE READ
隔离级别。
SELECT @@GLOBAL.tx_isolation, @@tx_isolation;
SET SESSION tx_isolation='READ-UNCOMMITTED';
要了解有关隔离级别的更多信息,请检查http://dev.mysql.com/doc/refman/5.5/en/set-transaction.html
答案 1 :(得分:1)
我不确定我理解你的确切问题,但是我试一试....
你喜欢这样:
1. Query for 1 row with a particular id in `mytable` with column `status=0`
2. Using that id do something in `other` table(s)
3. When done, update `mytable` with`status=1`
你不能这样做吗?
1. Query for all rows in `mytable` with column `status=0`
2. Save those rows in a temporary table
3. Iterate the temporary table to do some things in `other` table(s)
4. When done, update all rows that should be affected in `mytable` with`status=1` (with TRANSACTIONS)
这样,您只需在更新时使用TRANSACTIONS。我认为这种方法会快得多,因为你只需要进行单一查询就可以了。
<强>更新强>
你总是可以做这样的事情来创建一个id为零的临时表:
(首先手动创建一个名为temptable的表格一次)
DROP temptable;
INSERT INTO `temptable`( mytable_id )
SELECT id FROM `mytable`WHERE status = 0
答案 2 :(得分:0)
其他&#39;正在做什么?表。根据您是否需要外部计算,您可以通过带有子选择的单个查询完成所有操作。如果计算基于两个表中的数据,则可以用这种方式编写。在大多数情况下,SQL不需要迭代,但直接作用于连接关系的每个交叉产品元组。
简而言之,请告诉我们更多关于您在步骤1&amp; 2然后我们可以看到。
(或者,您可以切换到支持存储过程的DB并以这种方式运行。)