MySQL заказ по запросу вопроса - PullRequest
       1

MySQL заказ по запросу вопроса

0 голосов
/ 17 сентября 2011

У меня возникли проблемы с использованием порядка в MySQL. У меня есть таблица с именем «site» с 3 полями, такими как id, name, rank. Эта таблица состоит из 1,4 млн записей. когда я применяю запрос, как,

select name from site limit 50000,10;  

возвращает 10 записей за 7,45 секунд [проверено через терминал]. Но когда я использую заказ в указанном выше запросе, как,

select name from site order by id limit 50000,10;  

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

Любая помощь с благодарностью, спасибо.

Ответы [ 2 ]

3 голосов
/ 17 сентября 2011

Это «ожидаемое» с большими LIMIT значениями:

С http://www.mysqlperformanceblog.com/2006/09/01/order-by-limit-performance-optimization/

Остерегайтесь большого LIMIT. Использование индекса для сортировки эффективно, если вам нужно сначаланесколько строк, даже если происходит дополнительная фильтрация, поэтому вам нужно сканировать больше строк по индексу, чем запрашивается LIMIT.Однако, если вы имеете дело с запросом LIMIT с большой эффективностью смещения, пострадает.LIMIT 1000,10, вероятно, будет намного медленнее, чем LIMIT 0,10.Это правда, что большинство пользователей не идут дальше 10 страниц в результатах, однако роботы поисковых систем вполне могут это сделать.Я видел ботов, которые смотрели более 200 страниц в моих проектах.Кроме того, для многих веб-сайтов, которые не в состоянии позаботиться об этом, очень легко запустить DOS-атаку - запросить страницу с большим количеством из нескольких соединений, и этого достаточно.Если вы ничего не делаете, убедитесь, что блокируете запросы со слишком большими номерами страниц.

В некоторых случаях, например, если результаты статичны, может иметь смысл предварительно вычислить результаты, чтобы вы могли запросить их о позициях.Таким образом, вместо запроса с LIMIT 1000,10 у вас будет позиция WHERE между 1000 и 1009, которая имеет одинаковую эффективность для любой позиции (до тех пор, пока она проиндексирована)

AND

Еще одно замечание об ORDER BY… LIMIT: оно предоставляет страшные операторы объяснения и может оказаться в медленном журнале запросов как запрос, который не использует индексы

Последний пункт - ВАЖНЫЙ момент в вашемслучай - комбинация ORDER BY и LIMIT с большой таблицей (1,4 м) и «неиспользуемыми индексами» (даже если есть индексы!) в этом случае приводит к очень низкой производительности ...

РЕДАКТИРОВАТЬ - согласно комментарию:

Для этого конкретного случая вы должны использовать select name from site order by id и обрабатывать разбиение набора результатов на куски по 50000 каждый в вашем коде!

1 голос
/ 17 сентября 2011

Можете ли вы попробовать это:

SELECT name 
FROM site 
WHERE id >= ( SELECT id
              FROM site
              ORDER BY id
              LIMIT 50000, 1
            )
ORDER BY id
LIMIT 10 ;  
...