request.cookies
является dict
, поэтому:
if 'country' in request.cookies:
# do something
else:
# do something else
Нормально, что более высокие смещения замедляют запрос вниз, так как запрос должен отсчитывать первые записи OFFSET + LIMIT
(и брать только LIMIT
из них). Чем выше это значение, тем дольше выполняется запрос.
Запрос не может перейти к OFFSET
, потому что, во-первых, записи могут иметь разную длину, и, во-вторых, могут быть пробелы, удаленные записей.
Предполагая, что id
является PRIMARY KEY
таблицы MyISAM
, вы можете ускорить его, используя этот трюк:
SELECT t.*
FROM (
SELECT id
FROM mytable
ORDER BY
id
LIMIT 10000, 30
) q
JOIN mytable t
ON t.id = q.id
См. эту статью:
Отнимающая много времени часть двух запросов извлекает строки из таблицы. Логически говоря, в версии LIMIT 0, 30
необходимо извлечь только 30 строк. В версии LIMIT 10000, 30
оценивается 10000 строк и возвращается 30 строк. Может быть какая-то оптимизация может быть выполнена моим процессом чтения данных, но рассмотрим следующее:
Что делать, если в запросах есть предложение WHERE? Механизм должен возвращать все строки, которые квалифицируются, а затем сортировать данные и, наконец, получать 30 строк.
Также рассмотрите случай, когда строки не обрабатываются в последовательности ORDER BY. Все квалификационные строки должны быть отсортированы для определения возвращаемых строк.
У меня была одна и та же проблема. Учитывая тот факт, что вы хотите собрать большое количество этих данных, а не определенный набор из 30, вы, вероятно, будете работать с циклом и увеличивать смещение на 30.
Итак, что вы можете сделать вместо этого :
WHERE id > lastId limit 0,30
Таким образом, вы всегда можете иметь смещение ZERO. Вы будете поражены улучшением производительности.
MySQL не может перейти непосредственно к 10000-й записи (или 80000-й байт, как вы предлагаете), потому что он не может предположить, что он упакован / упорядочен как этот (или что он имеет непрерывные значения от 1 до 10000). Хотя это может быть и так на самом деле, MySQL не может предположить, что нет дыр / пробелов / удаленных идентификаторов.
Итак, как отмечали бобы, MySQL должен будет получить 10000 строк (или пройти через 10000-й записи индекс на id
), прежде чем найти 30 для возврата.
EDIT: Чтобы проиллюстрировать мою точку
Обратите внимание, что хотя
SELECT * FROM large ORDER BY id LIMIT 10000, 30
будет slow (er) ,
SELECT * FROM large WHERE id > 10000 ORDER BY id LIMIT 30
будет fast (er) и будет возвращать те же результаты при условии отсутствия отсутствующих id
s (т. е. пробелов).
Я нашел интересный пример для оптимизации запросов SELECT ORDER BY id LIMIT X, Y. У меня 35 миллионов строк, поэтому для поиска ряда строк потребовалось 2 минуты.
Вот трюк:
select id, name, address, phone
FROM customers
WHERE id > 990
ORDER BY id LIMIT 1000;
Просто поставьте ГДЕ с последним идентификатором, который вы получили увеличить производительность. Для меня это было от 2 минут до 1 секунды:)
Другие интересные трюки здесь: http://www.iheavy.com/2013/06/19/3-ways-to-optimize- for-paging-in-mysql /
Он также работает со строками
ORDER BY
отсутствует, или индекс охватывает все поля, которые вам нужны, вам не нужно это обходное решение. – Quassnoi 24 November 2011 в 20:13id
, что «трюк» становится медленным. Реальное «исправление» означает «запомнить, где вы остановились». – Rick James 6 July 2015 в 21:05