На Unix time.clock () измеряет сумму процессорного времени, которое использовалось текущим процессом, таким образом, это бесполезно для измерения прошедшего времени от некоторой точки в прошлом. В Windows это будет иметь размеры, тактовые стеной секунды протекли начиная с первого вызова к функции. В любой системе time.time () возвратится, секунды передали с эпохи.
, Если Вы пишете код, это означало только для Windows, любой будет работать (хотя Вы будете использовать два по-другому - никакое вычитание не необходимо для time.clock ()). Если это соберется работать на системе Unix, или Вы хотите код, который, как гарантируют, будет портативным, Вы захотите использовать time.time ().
Возможно, вы могли бы создать индексирующую таблицу, которая предоставляет последовательный ключ, связанный с ключом в вашей целевой таблице. Затем вы можете присоединить эту таблицу индексации к целевой таблице и использовать предложение where для более эффективного получения нужных строк.
#create table to store sequences
CREATE TABLE seq (
seq_no int not null auto_increment,
id int not null,
primary key(seq_no),
unique(id)
);
#create the sequence
TRUNCATE seq;
INSERT INTO seq (id) SELECT id FROM mytable ORDER BY id;
#now get 1000 rows from offset 1000000
SELECT mytable.*
FROM mytable
INNER JOIN seq USING(id)
WHERE seq.seq_no BETWEEN 1000000 AND 1000999;
Где-то в Интернете есть запись в блоге о том, как лучше всего сделать выбор отображаемых строк как можно более компактным, например: только идентификаторы; и получение полных результатов должно, в свою очередь, получить все необходимые данные только для выбранных вами строк .
Таким образом, SQL может быть чем-то вроде (непроверенный, я не уверен, что он действительно будет работать ничего хорошего):
select A.* from table A
inner join (select id from table order by whatever limit m, n) B
on A.id = B.id
order by A.whatever
Если ваш механизм SQL слишком примитивен, чтобы допускать такие операторы SQL, или он ничего не улучшает, вопреки надежде, возможно, имеет смысл разбить этот единственный оператор на несколько операторов и захватить идентификаторы в структура данных.
Обновление : Я нашел сообщение в блоге, о котором я говорил: это был Джефф Этвуд «Все абстракции - неудачные абстракции»
Ответ Пола Диксона действительно является решением проблемы, но вам придется поддерживать таблицу последовательности и следить за тем, чтобы в строках не было пробелов.
Если это возможно, лучшее решение было бы просто гарантировать, что исходная таблица не имеет пробелов в строках и начинается с идентификатора 1. Затем захватите строки, используя идентификатор для разбивки на страницы.
SELECT * FROM table A WHERE id> = 1 AND id <= 1000;
ВЫБРАТЬ * ИЗ таблицы A WHERE id> = 1001 AND id <= 2000;
и так далее ...