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: