Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Оптимизация запроса / 5 сообщений из 5, страница 1 из 1
21.08.2013, 11:45:19
    #38372991
АРАКУЛ
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизация запроса
Добрый день. Можно оптимизировать данный запрос?
Цель запроса - сделать выборки 5 случайных товаров с определенными характеристиками. 5 запросов объединенных union и distinct в начале каждого.


Код: sql
1.
2.
3.
4.
5.
(select DISTINCT a.* from advertisement a, company b, agent c,category_ad d where a.enabled=1 and a.company_id=b.id and b.agent_id=c.id and c.enabled=1 and a.category_ad_id=17 limit 362, 1)   UNION 
(select DISTINCT a.* from advertisement a, company b, agent c,category_ad d where a.enabled=1 and a.company_id=b.id and b.agent_id=c.id and c.enabled=1 and a.category_ad_id=17 limit 295, 1) UNION 
(select DISTINCT a.* from advertisement a, company b, agent c,category_ad d where a.enabled=1 and a.company_id=b.id and b.agent_id=c.id and c.enabled=1 and a.category_ad_id=17 limit 84, 1) UNION 
(select DISTINCT a.* from advertisement a, company b, agent c,category_ad d where a.enabled=1 and a.company_id=b.id and b.agent_id=c.id and c.enabled=1 and a.category_ad_id=17 limit 370, 1) UNION 
(select DISTINCT a.* from advertisement a, company b, agent c,category_ad d where a.enabled=1 and a.company_id=b.id and b.agent_id=c.id and c.enabled=1 and a.category_ad_id=17 limit 70, 1)
...
Рейтинг: 0 / 0
21.08.2013, 12:25:53
    #38373070
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизация запроса
АРАКУЛЦель запроса - сделать выборки 5 случайных товаров с определенными характеристиками.
Код: sql
1.
2.
3.
4.
5.
select DISTINCT a.* 
from advertisement a, company b, agent c,category_ad d 
where a.enabled=1 and a.company_id=b.id and b.agent_id=c.id and c.enabled=1 and a.category_ad_id=17
ORDER BY rand()
LIMIT 5
...
Рейтинг: 0 / 0
21.08.2013, 14:41:04
    #38373351
АРАКУЛ
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизация запроса
Akina,
А разве это будет работать быстрее? И почему
...
Рейтинг: 0 / 0
21.08.2013, 14:50:59
    #38373370
Cygapb-007
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизация запроса
AkinaАРАКУЛЦель запроса - сделать выборки 5 случайных товаров с определенными характеристиками.
Код: sql
1.
2.
3.
4.
5.
select DISTINCT a.* 
from advertisement a, company b, agent c,category_ad d 
where a.enabled=1 and a.company_id=b.id and b.agent_id=c.id and c.enabled=1 and a.category_ad_id=17
ORDER BY rand()
LIMIT 5

Выделенное означает:
1. для каждой строки таблицы посчитать значение RAND()
2. отсортировать таблицу по полученному значению
3. взять 5 первых строк из полученного
Не уверен, в какой момент будет задействован DISTINCT

В общем-то не очень быстрая процедура... :)

Если исправить исходный запрос так, чтобы можно было убрать DISTINCT (там cross join category_ad), а UNION заменить на UNION ALL - вроде бы должно получиться побыстрее :)

А вообще-то можно и как-то так:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
-- подготовка таблицы
drop temporary table if exists advertisement_temporary;
create temporary table advertisement_temporary (
   row_number int identity primary key,
   id int, ... <необходимые поля из ADVERTISEMENT>
select null row_number, a.id, ... <необходимые поля из ADVERTISEMENT>
   from advertisement a
   where a.category_ad_id=17 and a.enabled=1 
    and exists(
      select 1
      from company b 
      join agent c on c.id=b.agent_id and c.enabled=1
      -- cross join category_ad d 
      where b.id=a.company_id
    )
LIMIT 370 -- максимальное из требуемых (362, 295, 84, 370, 70)
;

-- получение требуемой выборки
select a.id, ... <необходимые поля из ADVERTISEMENT>
from advertisement_temporary a
where a.row_number in (362, 295, 84, 370, 70)
order by field(a.row_number, 362, 295, 84, 370, 70);

drop temporary table advertisement_temporary;
...
Рейтинг: 0 / 0
21.08.2013, 15:01:04
    #38373392
Cygapb-007
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизация запроса
а вообще-то во временной табличке кроме id никаких полей из ADVERTISEMENT не нужно :)
Все необходимое можно получить в финале по JOIN ADVERTISEMENT
...
Рейтинг: 0 / 0
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Оптимизация запроса / 5 сообщений из 5, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]