сортировка по 3 полям - оптимизация

  • Автор темы Автор темы berkut
  • Дата начала Дата начала

berkut

Новичок
сортировка по 3 полям - оптимизация

вопрос скорее математический. Есть такое: ORDER BY field1, field2, field3 либо ORDER BY field2, field1, field3 - т.е. 2 варианта следования полей.
все поля - числа с плавающей точкой больше нуля. Можно-ли как-то посчитать коэфицент этих 3-х полей для обоих типов сортировки, что-бы вписать их в отдельное поле и сортировать только по 1 полю? Только при условии, что сортировка по этим коэфицентам будет давать ровно такой-же результат, как и по 3 полям. Хотя-бы чисто теоретически такая возможность может существовать?
 
berkut
возможные диапазоны чисел field(1|2|3) известны или каждое из них может быть хоть 0.1, хоть 10^10 ?
 
Gas
хочешь предложить дополнить нулями и записать через разделитель? :-)
 
от 0 до 10 сейчас, в будущем может до 100 увеличиться - но там если что, можно будет думать опять.
zerkms о! спасибо. но если дополнять слева - это уже строка получается?
от дроби можно избавиться, точность до сотых.
 
zerkms
:) ты знал
умножать на граничные значения и порядок в сортировке каждое число с прибавлением остальных по такой же схеме
 
Gas
это как? если макс. 10, то field1 * 10 * {порядок перечисления} +
 
а смысл па с 1 полем?
думаю что сортировка по составному индексу, тем более числовому, будет эффективнее
не?
 
а с индексом наверное проблема. т.к. выборка идёт по field4, field5 - и кол-во полей не фиксированное, от 1 до 6 полей.
в такой ситуации если только огромную тучу составных индексов плодить - а это тормоза при вставке
 
berkut
то я не совсем правильно сказал, получается нужно так
(field1 * 10^8 + 1) + (field2 * 10^4 + 1) + field3

[updated] это для диапазона 0.01 - 100, если нужно 0.01-10, то степени 7 и 2

zerkms
бывает множество условий и одинаковая сортировка для них всех по нескольким столбцам - чтоб уменьшить размер индекса
 
а выборки большие обычно получаются?
намекаю на то - что может и не сортировать по индексу? :-)
 
zerkms
у меня были да (если без limit'а), а к berkut'у вопрос закономерный :)
 
намекаю на то - что может и не сортировать по индексу? :-)
намёк не понял( я исхожу из того, что выборка всегда в разы меньше, чем рядов для поиска - поэтому думаю для поиска использовать индексы, а для сортировки файл сорт.
у меня были да (если без limit'а)
и это я не понял( разве LIMIT может влиять на скорость сортировки, при условии просмотра самых последних записей?

-~{}~ 03.04.08 16:24:

т.е. если под условие попало 100 рядов, тянем LIMIT 90, 10 - то разве лимит сыграет роль?

-~{}~ 03.04.08 16:25:

да и попутно вопрос: mysql остановит сортировку при LIMIT 10 после того, как отсортирует 10 рядов или до победы?
 
т.е. если под условие попало 100 рядов, тянем LIMIT 90, 10 - то разве лимит сыграет роль?
здесь, конечно же, нет
а LIMIT 0, 10 будет останавливаться конечно же после первых 10 записей

я исхожу из того, что выборка всегда в разы меньше, чем рядов для поиска - поэтому думаю для поиска использовать индексы, а для сортировки файл сорт.
вот и я к тому же - может сначала оценить затраты, а потом уже пытаться оптимизировать?
 
вот и я к тому же - может сначала оценить затраты, а потом уже пытаться оптимизировать?
т.е. file sort по 3 полям vs file sort по 1 полю - стоит-ли оптимизировать?? или какие затраты?
 
если у тебя под where попадает 100 записей из миллиона, а тебе нужно получить первые 20 отсортированных по какому-то критерию - то наличие индекса для сортировки не даст архи-выигрыша в производительности. Вот если бы под условия попадало 1000 - выигрыш от индекса намного ощутимей. Цифры взяты с потолка.
 
да это-то понятно. но я во первых исхожу, что при составном индексе на выборку, проще при обновлении если индекс по 1 полю, нежели чем по 3. А учитывая, что выборка может идти от 1 до 6 полей, то сколько мне составных индексов надо для выборки и сортировки - этоже кошмар: (where1, sort1, sort2, sort3), (where1, where2, sort1, sort2, sort3) и т.д.
либо разбивать - при поиске тянуть id без сортировки, потом WHERE id IN() ORDER BY - тогда кол-во индексов сократиться
 
1. лично я думаю что одно поле с таким теоретически не справится. потому что если запись при сортировки в первом варианте будет на 2-ом месте с 3-х. а при втором на 1-ом. то получается несоответствие так как при первом способе она должна быть на последним месте.

вот пример. пусть есть
3 3 3
1 2 3
2 1 3
при первом способе сортировки:
1 2 3
2 1 3
3 3 3
при втором:
2 1 3
1 2 3
3 3 3

извините за может не совсем ясное обьяснение и плохой русский.

2. а вот используя два дополнительных поля, по одному для каждого способа сортировки, можно добиться нужного результата.
 
Сверху