SQLinfo.ru - Все о MySQL

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

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

Вы не зашли.

#1 20.06.2014 16:44:12

Jenia
Участник
Зарегистрирован: 20.06.2014
Сообщений: 3

Выбор по группам

Есть БД(большая более 800000 записей), необходимо выбрать определенное количество записей по группам(групп может быть от одной до 1200).

1. вариант который попробовал это через UNION:

(SELECT pid, pphone, FROM phones WHERE plocid = 28 ORDER BY pcount, prandval LIMIT 100)  
UNION  
(SELECT pid, pphone, FROM phones WHERE plocid = 37 ORDER BY pcount, prandval LIMIT 5000)
UNION  ...

и так далее по каждой группе (plocid и есть группа)
НО это очень долго, начинает ощущаться когда групп уже больше 5


2. вариант с переменнымми:
SET @x1 = 0, @x2 = 0, @x3 = 0, @x4 = 0, @x5 = 0, @x6 = 0, @x7 = 0, @x8 = 0, @x9 = 0, @x10 = 0, @x11 = 0, @x12 = 0, @x13 = 0, @x14 = 0, @x15 = 0,@x16 = 0, @x17 = 0, @x18 = 0, @x19 = 0, @x20 = 0, @x21 = 0, @x22 = 0, @x23 = 0, @x24 = 0, @x25 = 0, @x26 = 0, @x27 = 0, @x28 = 0, @x29 = 0, @x20 = 0,@x31 = 0, @x32 = 0, @x33 = 0, @x34 = 0, @x35 = 0;
SELECT pid, pphone, plocid FROM phones
WHERE
(@x1<=48 AND plocid = 37 AND (@x1:=@x1+1)>=0)
OR  (@x2<=14 AND plocid = 92 AND (@x2:=@x2+1)>=0)
OR  (@x3<=5 AND plocid = 130 AND (@x3:=@x3+1)>=0)
OR  (@x4<=38 AND plocid = 148 AND (@x4:=@x4+1)>=0)
OR  (@x5<=21 AND plocid = 155 AND (@x5:=@x5+1)>=0)
...
ORDER BY pcount, prandval;

Работает значительно быстрее. Но потом заметил, что в начале выбираются записи с нужным условием, а потом сортируются. Нужно наоборот в отсортированном выбрать нужное количество записей с требуемым условием.

Подскажите может быть можно еще как то по другому это сделать?

Неактивен

 

#2 21.06.2014 21:10:00

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Выбор по группам

Первый вариант с заменой union на  union all должен работать быстрее при наличии нужного индекса (plocid, pcount, prandval).

Неактивен

 

#3 21.06.2014 22:37:38

Jenia
Участник
Зарегистрирован: 20.06.2014
Сообщений: 3

Re: Выбор по группам

попробовал UNION ALL, производительность  осталась такая же. Поля проиндексированы,  возможно нужно как то иначе индексировать   , у меня стоит IndexType: Normal, Index method: btree

Неактивен

 

#4 22.06.2014 00:05:45

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Выбор по группам

Нужен составной индекс на 3 поля.

Неактивен

 

#5 22.06.2014 00:40:37

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Выбор по группам

Что касается второго варианта с переменными, то можно было бы перенести сортировку во from-подзапрос, но это не будет работать в новых версиях http://sqlinfo.ru/forum/viewtopic.php?id=6934&p=1

Другой вариант, перенести условие в часть select:
select pid, pphone, plocid from (
SELECT pid, pphone, plocid, if((@x1<=48 AND plocid = 37,(@x1:=@x1+1),0) x1,
  if((@x2<=14 AND plocid = 92,(@x2:=@x2+1),0) x2
FROM phones ORDER BY pcount, prandval) t
WHERE x1<>0 or x2<>0;
Но это как минимум полный скан таблицы.


Переменные ускоряют запросы, но это относится к узкому классу задач, см http://webew.ru/articles/3923.webew

Неактивен

 

#6 23.06.2014 13:09:39

Jenia
Участник
Зарегистрирован: 20.06.2014
Сообщений: 3

Re: Выбор по группам

Большое спасибо за помощь. Буду проверять тестировать. И за статью спасибо, уверен что поможет.

Хотя думаю, что необходимо поменять подход к решению задачи.
Если будет хорошее решение обязательно тут отпишусь.

Неактивен

 

Board footer

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