Имя: Пароль:
IT
Админ
Простой sql Запрос выполняется 20 секунд.
0 DirecTwiX
 
05.03.13
18:36
select A, B, sum(1) as Cnt from tbl group by A, B order by Cnt desc limit 10;

A и B - varchar(50)
Пробовал ставить индекс на A и B, даже FULLTEXT пробовал. 20 секунд.
База 600000 строк
1 NS
 
05.03.13
18:38
У тебя сортировка в запросе.
2 МихаилМ
 
05.03.13
18:40
какаято ерунда с limit

нужно либо group by либо  limit

обернуть в вложенный запрос.
3 Fragster
 
гуру
05.03.13
18:44
(0) в любом случае будет скан, что ж ты хочешь?
4 КонецЦикла
 
05.03.13
18:47
А если поместить во временную таблицу с индексом а потом уже сортировать?
Что скажет тогда план выполнения?
5 MrStomak
 
05.03.13
18:48
(4) Фулл скан как уйдёт?
6 КонецЦикла
 
05.03.13
18:49
(5) А зачем он?
7 DirecTwiX
 
05.03.13
18:49
(1) Так мне она и нужна
(2) "select А, Б, С from (select А, Б, sum(1) as С from тбл group by А, Б) aa order by С desc limit 10"
Так? Ещё дольше. 25 секунд
(3) То есть выполнять такой запрос онлайн не вариант?
8 MrStomak
 
05.03.13
18:52
(6) В запросе нет условий на таблицу, нет соединений - значит нужны все данные, значит нужен тэйбл скан.
9 DirecTwiX
 
05.03.13
18:53
Группировка происходит долго - 99% времени. Как обойти?
10 MrStomak
 
05.03.13
18:56
ну прежде всего нужно понять, что ты хочешь получить с этим limit
11 MrStomak
 
05.03.13
18:58
Если так как я понял - 10 самых распространённых сочетаний разных A,B, то от долгой группировки не уйти, либо использовать вспомогательную таблицу
12 МихаилМ
 
05.03.13
19:03
(9)
сделайте как в 1с  факты ->  агрегаты

и читайте агрегаты
13 Fragster
 
гуру
05.03.13
19:07
(9) навесить триггер с обновлением другой таблицы в фоне
14 Fragster
 
гуру
05.03.13
19:07
(13)+ в другой таблице хранить нужный разрез
15 NS
 
05.03.13
19:11
(4) Время создания индекса равно времени сортировки.
16 NS
 
05.03.13
19:13
поставь условие перед сортировкой, cnt>1
17 Fragster
 
гуру
05.03.13
19:15
(16) тут да,  сортировать надо будет меньше. Но (3)
18 NS
 
05.03.13
19:16
Скан - линейное время, сортировка результата - N lnN в сотню раз дольше.
19 Fragster
 
гуру
05.03.13
19:17
(18)->(9)
20 NS
 
05.03.13
19:17
главное чтоб и на А и на B был индекс.
21 NS
 
05.03.13
19:18
(19) А это очень странно и не похоже на правду.
Сгруппировать по индексу это быстро.
22 КонецЦикла
 
05.03.13
19:20
Да, тут промашка
Нужно что-то математическое применять :)
23 Fragster
 
гуру
05.03.13
19:25
(21) может у него 100 результатов всего
24 Fragster
 
гуру
05.03.13
19:25
после группировки
25 NS
 
05.03.13
19:28
Тогда индекс по двум полям добавить.
(23) Но мы же этого не знаем. :)
Но группировка 600000 знаечний не может занимать 20 секунд, если используется индекс.
26 Fragster
 
гуру
05.03.13
19:36
значит вопрос, сколько оно выполняется без сортировки и лимита
27 Fragster
 
гуру
05.03.13
19:36
и сколько там строк
28 Эмбеддер
 
05.03.13
20:35
а для чего sum(1)? count(*) в этом SQL нету?
29 ILM
 
гуру
05.03.13
20:39
Пробуй сначала
DISTINCT A, В
Потом COUNT
Потом FIRST 10
30 DirecTwiX
 
05.03.13
22:43
База выросла до 2,5 млн
Запрос этот же выполняется за 114 секунд.
И я погорячился про группировка - когда тестировал без группировки, оставил лимит.
Индекс стоит на А и Б в режиме FULLTEXT


(28) А какая разница?
(29) Одинаковых А и В нет (комбинаций)
31 Fragster
 
гуру
05.03.13
22:45
(30) один обычный индекс на два поля
32 NS
 
05.03.13
22:45
(30) Составной индекс пробовал делать?
Что значит нет одинковых комбинаций? Что у тебя тогда сортировка делает? Единицы сортирует?
33 DirecTwiX
 
05.03.13
23:01
(31) Пробовал, в шапке есть)
(32) Это я к (29). Предлагали DISTINCT к A, B добавить
Индекса всего три - A, B, А и В. Везде FULLTEXT. На A и В пробовал обычный ставить. Попробовать на А и В?
34 mistеr
 
05.03.13
23:04
(0),(30) Слишком долго для таких маленьких объемов. Что-то не так с базой. Может диск тупит. select count(*) сколько?
35 NS
 
05.03.13
23:05
(33) попробовать убрать сортировку.
36 КонецЦикла
 
06.03.13
00:37
Нужен нетривиальный подход
Как ни крути все одна хрень
Упорядочивание портит
37 NS
 
06.03.13
00:48
Да блин, от тс не добиться результата без сортировки. Утаивает.
38 DirecTwiX
 
06.03.13
01:06
Выбирал из 300000.
С сортировкой: 10 секунд
Без: 10 секунд
39 DirecTwiX
 
06.03.13
01:09
Без группировки: 0.4
Без группировки с сортировкой по А: 0.6
40 NS
 
06.03.13
01:28
(39) Группировка всегда дает сортировку.
Попробуй вот так.
select A, B from tbl group by A, B
order by null;
41 NS
 
06.03.13
01:30
При этом с составным индексом.
42 Torquader
 
06.03.13
01:30
Ну а что тут удивительного - запрос - полный скан таблицы, почему бы ему долго и не выполняться ?
На некоторых SQL-системах запрос SELECT COUNT(*) FROM [TableName] оказывается очень длительным.
43 DirecTwiX
 
06.03.13
01:47
(40) В (38). Да, сортировка за даром происходит
44 NS
 
06.03.13
02:03
(43) Не за даром. она происходит в любом случае.
попробуй (40)
(42) Но не в его случае. У него выборка быстрее секунды. см. (39)
45 NS
 
06.03.13
02:04
А в (39) Идет сортировка по индексу.
46 DirecTwiX
 
06.03.13
02:10
(44) Попробовал отсортировать по null. Те же 10 секунд
47 NS
 
06.03.13
02:21
Тогда значит тормозит группирвка, не хочет использовать составной индекс.
48 DirecTwiX
 
06.03.13
02:24
Спасибо и на этом!
Буду пробовать)
49 NS
 
06.03.13
02:26
Хотя пишут что должна использовать составной индекс.
50 DirecTwiX
 
06.03.13
02:30
Я составной не пробовал ставить в INDEX (стоит в FULLTEXT).. Сейчас попробую
51 DirecTwiX
 
06.03.13
02:31
Как только базу починю)) Вдруг начал выдавать при записи, что основной ключ не уникален.. А на нём автоинкримент стоит.. Весело)
http://www.softwareprojects.com/resources/programming/t-how-to-fix-mysql-duplicate-entry-for-key-primary-o-1844.html
52 DirecTwiX
 
06.03.13
04:06
Толку ноль.. Может надо группировать по имени индекса?)
53 NS
 
06.03.13
04:31
(52) попробуй
select A, B from tbl FORCE INDEX (А_В) group by A, B
order by null;
Где A_B - твой составной индекс
54 NS
 
06.03.13
04:40
И
select A, B from tbl FORCE INDEX (А_В) group by A, B
order by A, B;
55 NS
 
06.03.13
05:34
Если у тебя сочетания А+В уникальные, тогда можно так - индекс только по А, сначала получаешь 10 первых А, а потом добавляешь все B по каждому А.
56 NS
 
06.03.13
07:12
Типа
select * from (тут собираешь твои А) as temp inner join ...
57 АНДР
 
06.03.13
09:18
NS, + 1. Нужен составной индекс и нужно смотреть на данные.

DirecTwiX, для вас похоже будет оправдан следующий алгоритм

Select Left(A, 4), Left(B, 4) inser into tb2 from tbl group by Left(A, 4), Left(B, 4) order by Cnt desc limit 10;

Select t1.A, t1.B From tbl t1 join tbl2 t2 On t1.a = t2.a And t1.b = t2.b group by t1.A, t1.B order by Count(t1.a) desc limit 10;



 



ЗЫ А что ожидаем то? Если сравнение происходит за один такт, то для 600 0000 оценочное время от 2 секунд. А varchar(50) за один такт не сравнить.
58 DirecTwiX
 
12.03.13
01:55
Итак. Вынес A и B в отдельные таблицы - тут оставил только Id, 3млн записей. Группирую по тем же А и В, только не по строкам, а по id. 60 секунд.
Добавил индекс на эти два столбца - 1 секунда =)
59 КонецЦикла
 
12.03.13
03:12
(58) Не потерялось ли решение в этих действиях?
Что такое id и как они нумеруются?
60 NS
 
12.03.13
12:09
(58) Ну вот, теперь составной индекс заработал.
61 DirecTwiX
 
12.03.13
17:41
(60) Да, видно. Но всё равно не понимаю, почему тогда не работал вообще никакой индекс..
(59) Нет, всё норм) ID - число, автоинкримент
Было
A B
Иванов Вася
Петров Вова
Стоа
А В
1 1
2 2
Т.е. вынес строки через ID в отедльную таблицу
62 DirecTwiX
 
12.03.13
17:46
Стало*

Заодно хочу спросить.. Если есть сотавной индекс на А и В, он будет работать при группировке А или В по отдельности?
63 NS
 
12.03.13
17:53
(62) При группировке по А - будет. По B - нет.
64 DirecTwiX
 
12.03.13
17:56
(63) А как определить по какой будет? Которая первая стоит? Глупость, имхо
65 NS
 
12.03.13
18:00
(64) При чем тут глупость?
Составной индекс. В первой и второй колонке число от 1 до 4.
11
12
13
14
21
22
23
24
Попробуй сгруппируй или отсортируй по нему по второй колонке. Или сгруппируй в порядке B,A.
66 DirecTwiX
 
12.03.13
18:03
Думал, что вдруг составной - это два одинарных.
Спасибо
67 NS
 
12.03.13
18:04
(66) Нет, составной это не два одинарных. А два одинарных это не составной.
Программист всегда исправляет последнюю ошибку.