[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: mysql select: сочетание order by по составному индексу и limit



rm-f@yandex.ru -> debian-russian@lists.debian.org  @ Thu, 17 May 2007 18:07:31 +0400:

 >>  r> Надеюсь у разработчиков MySQL были весомые причины по разному
 >>  r> использовать индекс в двух запросах:
 >>  r> 1) select ... order by F1 limit N
 >>  r> 2) delete ... order by F1 limit N
 >>  r> прим: F1 - первое поле составного индекса
 >> Скажем так, у них нет весомых причин непременно использовать его
 >> одинаково.  А разным использование может быть, например, потому, что в
 >> результате select они выдают все запрошенное (и значит, формируют ответ
 >> перед выдачей - оно у них вроде бы делается именно так), а в результате
 >> delete они удаляют, и ничего никуда не собирают.  Для разных операций
 >> возможны разные обходы второго уровня индекса.

 r> возможно это и так, к тому же ситуация полностью укладывается в стандарт SQL,
 r> то есть нельзя сказать что select вернул не тот набор данных,
 r> которые задали "order by F1"

 r> кстати
 r> 1) select ... order by F1 limit N
 r> 2) select ... order by F1
 r> тоже различаются возвращаемому набору, в части пересечения естественно

 r> И все-таки, по моему мнению, это как если бы sprintf и fprintf по разному
 r> отрабатывали форматную строку.

Не все аналогии верны.  Кстати, я могу объяснить, почему различаются
результаты двух селектов (и возможно, почему delete работает как
второй).  Дело в том, что если ты собираешься вернуть все 6 записей, ты
выделяешь память под 6 записей - ее один фиг выделять.  А дальше у тебя
выбор - заполнить ее проходом через индекс, а можно сначала заполнить из
таблицы, а потом посортировать (у тебя там явно массив указателей,
т.е. при сортировке ты меняешь местами не все содержимое записей).  Если
таблица маленькая, второй способ выгоднее.

Когда же у тебя там еще и limit 3, ты выделяешь память только под 3
записи.  И тут уже надо сначала решить, какие именно 3 записи туда
попадут, а потом уже писать.  Что удобнее делать уже через индекс.

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

А когда у тебя delete ... order by ... limit 3 - тебе не надо выделять
память под сами записи.  Тебе надо найти те три записи, которые надо
удалить.  Что можно делать через индекс, а можно, увидев, что табличка
небольшая, и напрямую.

-- 
Artem Chuprina
RFC2822: <ran{}ran.pp.ru> Jabber: ran@jabber.ran.pp.ru

Дело говоришь!
Теперь делай его.
	Кнышев.



Reply to: