Как я могу ускорить запрос MySQL с большим смещением в ПРЕДЕЛЬНОМ пункте?

На Unix time.clock () измеряет сумму процессорного времени, которое использовалось текущим процессом, таким образом, это бесполезно для измерения прошедшего времени от некоторой точки в прошлом. В Windows это будет иметь размеры, тактовые стеной секунды протекли начиная с первого вызова к функции. В любой системе time.time () возвратится, секунды передали с эпохи.

, Если Вы пишете код, это означало только для Windows, любой будет работать (хотя Вы будете использовать два по-другому - никакое вычитание не необходимо для time.clock ()). Если это соберется работать на системе Unix, или Вы хотите код, который, как гарантируют, будет портативным, Вы захотите использовать time.time ().

25
задан secondtruth 4 February 2013 в 14:27
поделиться

3 ответа

Возможно, вы могли бы создать индексирующую таблицу, которая предоставляет последовательный ключ, связанный с ключом в вашей целевой таблице. Затем вы можете присоединить эту таблицу индексации к целевой таблице и использовать предложение 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;
13
ответ дан 28 November 2019 в 21:37
поделиться

Где-то в Интернете есть запись в блоге о том, как лучше всего сделать выбор отображаемых строк как можно более компактным, например: только идентификаторы; и получение полных результатов должно, в свою очередь, получить все необходимые данные только для выбранных вами строк .

Таким образом, 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, или он ничего не улучшает, вопреки надежде, возможно, имеет смысл разбить этот единственный оператор на несколько операторов и захватить идентификаторы в структура данных.

Обновление : Я нашел сообщение в блоге, о котором я говорил: это был Джефф Этвуд «Все абстракции - неудачные абстракции»

9
ответ дан 28 November 2019 в 21:37
поделиться

Ответ Пола Диксона действительно является решением проблемы, но вам придется поддерживать таблицу последовательности и следить за тем, чтобы в строках не было пробелов.

Если это возможно, лучшее решение было бы просто гарантировать, что исходная таблица не имеет пробелов в строках и начинается с идентификатора 1. Затем захватите строки, используя идентификатор для разбивки на страницы.

SELECT * FROM table A WHERE id> = 1 AND id <= 1000;
ВЫБРАТЬ * ИЗ таблицы A WHERE id> = 1001 AND id <= 2000;

и так далее ...

2
ответ дан 28 November 2019 в 21:37
поделиться
Другие вопросы по тегам:

Похожие вопросы: