Имя: Пароль:
IT
 
SQL. Помогите оптимизировать запрос
0 DirecTwiX
 
20.03.13
19:51
Мой вопрос не прошёл премодерации на хабре, поэтому я вернулся сюда)

Есть простой запрос:
SELECT
   A,
   COUNT(*) AS Cnt
FROM
   (SELECT
       A
   FROM
       tbl
   LIMIT 8000000) a  
GROUP BY
   A
ORDER BY
   Cnt DESC
LIMIT 10

На А (int) есть индекс. В зависимости от числа во внутреннем запросе время выполнения изменяется линейно. На 8млн запрос выполняется 60 секунд. Как оптимизировать?
1 МихаилМ
 
20.03.13
19:57
ошиблись форумом.
Вам суда
http://www.sql.ru/forum/actualtopics.aspx?bid=6
2 Fragster
 
гуру
20.03.13
19:59
не использовать вложенный запрос.
3 Fragster
 
гуру
20.03.13
20:00
(1) нет, эта тема увеличивает долю не-лайфа на мисте
4 Живой Ископаемый
 
20.03.13
20:00
2(0) только после того как ответишь в своей предыдущей ветке, а лучше никогда
5 Fragster
 
гуру
20.03.13
20:00
хотя это в любом случае скан
6 SherifSP
 
20.03.13
20:03
Прострелить коленку не предлагать?)))))
7 NS
 
20.03.13
20:06
У тебя вычисляемое поле, оно вмегда без индекса, по нему слишком долгая сортировка. Поставь на него условие, например cnt>1
8 bahmet
 
20.03.13
20:09
(0) тебе же в предыдущей ветке писали про кеш  и прочее.
и про кривость запроса и тд.
сразу не понятно?
если написать как увеличить кеш  - то потом будет вопрос:
лимит 32кк - выполняется полчаса, как оптимизировать?
9 МихаилМ
 
20.03.13
20:10
(0)
в limit очень желательно указывать order
10 DirecTwiX
 
20.03.13
20:28
(7) Ставил. Толку ноль. 10% времени можно выиграть.. Но суть не в этом
(8) Искренне не понимаю, что хочешь сказать.
Какой кеш? Ты оптимизируешь запросы увеличивая кеш? В каком месте запрос кривой? Что-нибудь путное можешь сказать?
11 Живой Ископаемый
 
20.03.13
20:39
почему он кривой, если он выдает тебе что нужно?
12 DirecTwiX
 
20.03.13
20:41
(11) Вот кто-то говорит, что он кривой.. Хотя сам ничего не понимает видимо
13 NS
 
20.03.13
20:46
А нельзя просто хранить таблицу с полями а и cnt, с индексом по cnt?
Тогда твой запрос будет выполняться моментально.
14 Живой Ископаемый
 
20.03.13
20:48
2(12) капец... тогда скажи ему что тебе сказали что твой запрос прямой.
15 acsent
 
20.03.13
20:51
какая операция самая дорогая по профайлеру?
16 be-may
 
20.03.13
20:53
а в чем разница между limit и top  ?
// ну, мне так.. чисто для себя узнать.
17 acsent
 
20.03.13
20:53
(16) в данном случае ни в чем
18 be-may
 
20.03.13
20:56
(17) а не в данном ? Просто впервые вообще слышу про limit..
19 be-may
 
20.03.13
20:58
у яндекса спрашивала. Ничего путного не нашла)
ну разве что вот : http://parser.groundzero.ru/425/52154/
говорят, топ быстрее.
20 mistеr
 
20.03.13
22:11
(0) В чем смысл запроса? Топ 10 самых популярных среди всех, или там еще условия будут?
Сколько строк в реальной таблице и с какой скоростью они туда добавляются?
21 Fragster
 
гуру
20.03.13
22:35
(18) это mysql а не mssql
22 mistеr
 
20.03.13
22:35
(0) С каких пор на Хабре и в вопросах премодерация?
23 DirecTwiX
 
20.03.13
22:39
(20) Именно. Пока только топ.
В таблице 14млн строк. В 100 ещё точно вырастет
24 DirecTwiX
 
20.03.13
22:39
(22) Может потому что у меня не было аккаунта до этого)
25 Fragster
 
гуру
20.03.13
22:39
(23) денормализируй, как было указано. если нужно - то по периодам/отрезкам.
26 YHVVH
 
20.03.13
22:42
интересно каким образом оптимизировать запрос, если он даже не полностью. что можно оптимизировать в обычной группировке.
27 Fragster
 
гуру
20.03.13
22:46
зачем делать запрос по миллионам строк, если на выходе их в 10000 раз менье?
28 DirecTwiX
 
20.03.13
22:59
(26) Он полностью.
(25) Поподробнее) Уже думал хеш-множество сделать, но не получаетсяя)
29 YHVVH
 
20.03.13
23:03
(28) если это весь запрос то почему нельзя сразу сгруппировать
30 DirecTwiX
 
20.03.13
23:04
(29) Внтуренний запрос для отладки. Иначе я буду ждать несколько минут
31 YHVVH
 
20.03.13
23:09
(30) ну если не трогать внутренний запрос, то он превращается в банальную группировку что там можно оптимизировать то?
32 Fragster
 
гуру
20.03.13
23:09
запили при вставке в основную таблицу вставку/обновление в таблицу "итогов"
33 mistеr
 
20.03.13
23:32
(23) В общем ясно, что изменения не realtime. Общий подход - материализовать и обновлять по расписанию. Реализация зависит от второго вопроса.
>В 100 ещё точно вырастет.
Да хоть двести. Я-то спросил "с какой скоростью". Сколько в сутки, в час, в секунду?
34 DirecTwiX
 
20.03.13
23:32
(32) Таблица итого будет больше этой минимум в 10000 раз
35 sdv2000
 
20.03.13
23:33
(34) честно-честно?
36 DirecTwiX
 
20.03.13
23:35
А ннет. Это в другом запросе так. В этом таблица итого спасёт
37 sdv2000
 
20.03.13
23:35
ну слава богу
38 rs_trade
 
21.03.13
00:19
(0) вьюху запили. нормально должно быть.
39 DirecTwiX
 
21.03.13
02:04
(38) Что значит?
40 rs_trade
 
21.03.13
10:09
(39) Попробуй сделать вьюшку, в которой будут сгрупированные результаты храниться. Запросом к вьюшке обращайся.