From your question, let's assume your table is called TNAME
You should collect the ids that are valid
First create a table to hold IDs and a process status per ID
CREATE TABLE idlist
(
id INT NOT NULL,
processed INT NOT NULL DEFAULT 0,
PRIMARY KEY (key),
UNIQUE KEY processed (processed,key)
) ENGINE=MyISAM;
Next, preload load all new IDs
INSERT IGNORE INTO idlist (id) SELECT id FROM TNAME WHERE SETNO=1 AND flag='valid';
This will load ids that are valid. IDs that were already loaded are bypassed
Using this idlist, pickup the first 200,000 ids
CREATE TABLE idlist200K SELECT id FROM idlist WHERE processed=0 ORDER BY id LIMIT 200000;
ALTER TABLE idlist200K ADD PRIMARY KEY (id);
Process the 200K rows with an INNER JOIN with queries like this:
SELECT B.* FROM idlist200K A INNER JOIN TNAME B;
When done processing, mark the IDs as processed:
UPDATE idlist A INNER JOIN idlist200K B USING (id) SET A.processed = 1;
DROP TABLE idlist200K;
All you have to do from here is automate all these steps, except the initial table creation
INSERT IGNORE INTO idlist (id) SELECT id FROM TNAME WHERE SETNO=1 AND flag='valid';
CREATE TABLE idlist200K SELECT id FROM idlist WHERE processed=0 ORDER BY id LIMIT 200000;
ALTER TABLE idlist200K ADD PRIMARY KEY (id);
SELECT B.* FROM idlist200K A INNER JOIN TNAME B; -- Whatever processing
UPDATE idlist A INNER JOIN idlist200K B USING (id) SET A.processed = 1;
DROP TABLE idlist200K;
Give it a Try !!!
flag = 'valid'condition. – dezso Jun 8 '12 at 8:42