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

berkut

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

вопрос скорее математический. Есть такое: ORDER BY field1, field2, field3 либо ORDER BY field2, field1, field3 - т.е. 2 варианта следования полей.
все поля - числа с плавающей точкой больше нуля. Можно-ли как-то посчитать коэфицент этих 3-х полей для обоих типов сортировки, что-бы вписать их в отдельное поле и сортировать только по 1 полю? Только при условии, что сортировка по этим коэфицентам будет давать ровно такой-же результат, как и по 3 полям. Хотя-бы чисто теоретически такая возможность может существовать?
 

Gas

может по одной?
berkut
возможные диапазоны чисел field(1|2|3) известны или каждое из них может быть хоть 0.1, хоть 10^10 ?
 

zerkms

TDD infected
Команда форума
Gas
хочешь предложить дополнить нулями и записать через разделитель? :)
 

berkut

Новичок
от 0 до 10 сейчас, в будущем может до 100 увеличиться - но там если что, можно будет думать опять.
zerkms о! спасибо. но если дополнять слева - это уже строка получается?
от дроби можно избавиться, точность до сотых.
 

Gas

может по одной?
zerkms
:) ты знал
умножать на граничные значения и порядок в сортировке каждое число с прибавлением остальных по такой же схеме
 

berkut

Новичок
Gas
это как? если макс. 10, то field1 * 10 * {порядок перечисления} +
 

zerkms

TDD infected
Команда форума
а смысл па с 1 полем?
думаю что сортировка по составному индексу, тем более числовому, будет эффективнее
не?
 

berkut

Новичок
а с индексом наверное проблема. т.к. выборка идёт по field4, field5 - и кол-во полей не фиксированное, от 1 до 6 полей.
в такой ситуации если только огромную тучу составных индексов плодить - а это тормоза при вставке
 

Gas

может по одной?
berkut
то я не совсем правильно сказал, получается нужно так
(field1 * 10^8 + 1) + (field2 * 10^4 + 1) + field3

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

zerkms
бывает множество условий и одинаковая сортировка для них всех по нескольким столбцам - чтоб уменьшить размер индекса
 

zerkms

TDD infected
Команда форума
а выборки большие обычно получаются?
намекаю на то - что может и не сортировать по индексу? :)
 

Gas

может по одной?
zerkms
у меня были да (если без limit'а), а к berkut'у вопрос закономерный :)
 

berkut

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

-~{}~ 03.04.08 16:24:

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

-~{}~ 03.04.08 16:25:

да и попутно вопрос: mysql остановит сортировку при LIMIT 10 после того, как отсортирует 10 рядов или до победы?
 

zerkms

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

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

berkut

Новичок
вот и я к тому же - может сначала оценить затраты, а потом уже пытаться оптимизировать?
т.е. file sort по 3 полям vs file sort по 1 полю - стоит-ли оптимизировать?? или какие затраты?
 

Gas

может по одной?
если у тебя под where попадает 100 записей из миллиона, а тебе нужно получить первые 20 отсортированных по какому-то критерию - то наличие индекса для сортировки не даст архи-выигрыша в производительности. Вот если бы под условия попадало 1000 - выигрыш от индекса намного ощутимей. Цифры взяты с потолка.
 

berkut

Новичок
да это-то понятно. но я во первых исхожу, что при составном индексе на выборку, проще при обновлении если индекс по 1 полю, нежели чем по 3. А учитывая, что выборка может идти от 1 до 6 полей, то сколько мне составных индексов надо для выборки и сортировки - этоже кошмар: (where1, sort1, sort2, sort3), (where1, where2, sort1, sort2, sort3) и т.д.
либо разбивать - при поиске тянуть id без сортировки, потом WHERE id IN() ORDER BY - тогда кол-во индексов сократиться
 

vasyaboychuk

Новичок
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. а вот используя два дополнительных поля, по одному для каждого способа сортировки, можно добиться нужного результата.
 
Сверху