SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 05.12.2010 13:34:49

relax
Участник
Зарегистрирован: 01.11.2010
Сообщений: 19

Агрегативная функция.

Можно ли в MySQL реализовать свою агрегативную функцию? скорость работы например собственной реализации какой-либо из стандартных функций будет сравнима с внутренней реализацией?

Неактивен

 

#2 05.12.2010 17:21:33

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Агрегативная функция.

Штатными методами нельзя, но приложение OpenSource smile

А что за агрегатная функция Вам нужна, которой еще нет?

Неактивен

 

#3 05.12.2010 21:07:27

relax
Участник
Зарегистрирован: 01.11.2010
Сообщений: 19

Re: Агрегативная функция.

Ну тогда это уже не mysql будет, никому не дашь smile)
Было бы красиво сделать через агрегацию в запросе, но увы.
Функций агрегаций очень мало, сами же знаете.
Я бы для начала group_concat дополнил LIMIT-ну очень часто хочется.

Неактивен

 

#4 06.12.2010 01:27:35

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Агрегативная функция.

А кто Вам мешает разумно поставить group_concat_max_len, а потом обрезать
по запятой обычным REPLACE?

Неактивен

 

#5 08.12.2010 14:30:58

relax
Участник
Зарегистрирован: 01.11.2010
Сообщений: 19

Re: Агрегативная функция.

Никто, кроме скорости. Если мне нужно по 3 айдишника, а оно мне  коллекцию из 30 штук соберет-ничего хорошего, сами понимаете. так как размеры int весьма широкие. Ну а определить min max по полю, размер цифры в символах, плясать от этого-это уже большой велосипед. Очень я не люблю  поддерживать такое или баги в таком искать-увольте. уж лучше цикл.

Вопрос такой-как вы бы стали решать, из опыта именно с mysql работы.
`a`,`b`,`c` . Нужно для каждого уникального `b` найти `a`,`b`,`c` где `c` максимальное(если несколько, то любую).
Вернуть только 30 штук, сортированные по убыванию `c`
варианты
1)SELECT * FROM  (SELECT `b`, max(`c`) as `max_c` group BY  `b`) as `new` LEFT join `table` on  `max_c`=`c`,`b`=`b`  ORDER BY `max_c` DESC LIMIT 30
минус-что много данных достанет лишних. LIMIT нельзя внутри, значит много.
Using index for group-by для внутреннего запроса, но все равно 0.08 работает.
2) Просто сортировка по `c`(индекс есть) и выбираем в цикле mysql уникальные по `b` сверху вниз.
минус-что пройдет много  данных по индексу, если `b` сильно неуникальное.
3) что-то еще.
У меня 2 побыстрее 1 выходит

Неактивен

 

#6 08.12.2010 14:48:52

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Агрегативная функция.

Зачем левое объединение? Почему все пишут левые объединения там, где место
внутреннему? sad

Первое на больших объемах должно работать быстрее при наличии нормальных
индексов.

Неактивен

 

#7 08.12.2010 15:19:26

relax
Участник
Зарегистрирован: 01.11.2010
Сообщений: 19

Re: Агрегативная функция.

составной индекс на `b`,`c`, вроде бы идеален, верно?
Хотя можно `b`,`c`,`a`-вся инфа поднимется из индекса тогда.
INNER JOIN vs LEFT JOIN?  никакой разницы  в данном случае, хотя идейно вы, безусловно, правы.

Неактивен

 

#8 08.12.2010 16:14:48

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Агрегативная функция.

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

Индекс на b,c — можно и его, но если добавить order by c в под-
запрос, то может оказаться хорошим индекс на (c,b) wink

Неактивен

 

#9 08.12.2010 16:19:26

relax
Участник
Зарегистрирован: 01.11.2010
Сообщений: 19

Re: Агрегативная функция.

Ага, спасибо.
А в mysql реализуется как-то более-менее логично структура типа хэша в хранимых процедурах ?
ну то есть что бы типа $a{key}=value и наличие по ключу быстро определялось
А то есть у меня мысль, но у больно дико получится.

Неактивен

 

#10 08.12.2010 18:26:37

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Агрегативная функция.

Временная табличка с индексом по ключевому полю? wink

Неактивен

 

#11 08.12.2010 20:17:42

relax
Участник
Зарегистрирован: 01.11.2010
Сообщений: 19

Re: Агрегативная функция.

Ну это я и решил, что оно. Там индексы-это хэш, но это все равно медленно будет. Потестим, сравним smile)

Неактивен

 

#12 08.12.2010 23:56:16

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Агрегативная функция.

Почему же медленно?

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson