тормозит JOIN

NightFlash

Новичок
тормозит JOIN

И снова обращаюсь я к Вам, о великие :)

есть 2 таблицы, Туристические туры и Курорты.
Задача, из Тур.туров выбрать все существующие Уникальные id'шники курортов по опр. стране, к ним подцепить названия курортов и вывести их в алфавитном порядке.

Таблица туров (для упрощения):
id INT(11)
country_id INT(11)
resort_id INT(11)

Таблица курортов:
id INT(11)
country_id INT(11)
title VARCHAR(80)

да, база денормализована и там и там есть country_id

Есть индекс по resort_id для туров
и индекс (title, id, coutry_id) для курортов

Пишем запрос:
PHP:
mysql> SELECT t1.resort_id, t2.title AS rtitle FROM travels AS t1 RIGHT JOIN resorts AS t2 ON t2.id=t1.resort_id WHERE t1.country_id=50 GROUP BY t2.title;
+-----------+---------------------------------+
| resort_id | rtitle                          |
+-----------+---------------------------------+
|        60 | Анталийское побережье - Алания  |
|        59 | Анталийское побережье - Анталия |
|        62 | Анталийское побережье - Белек   |
|        63 | Анталийское побережье - Кемер   |
|        61 | Анталийское побережье - Сиде    |
|        58 | Кушадасы                        |
|        65 | Мармарис                        |
|       220 | Стамбул                         |
+-----------+---------------------------------+
8 rows in set (8.34 sec)

+----+-------------+-------+--------+--------------------------------------+---------+---------+---------------------+--------+----------------------------------------------+
| id | select_type | table | type   | possible_keys                        | key     | key_len | ref                 | rows   | Extra                                        |
+----+-------------+-------+--------+--------------------------------------+---------+---------+---------------------+--------+----------------------------------------------+
|  1 | SIMPLE      | t1    | ref    | search1 | search1 | 5       | const               | 525531 | Using where; Using temporary; Using filesort |
|  1 | SIMPLE      | t2    | eq_ref | PRIMARY                              | PRIMARY | 4       | atlas2.t1.resort_id |      1 |                                              |
+----+-------------+-------+--------+--------------------------------------+---------+---------+---------------------+--------+----------------------------------------------+
search1: это индекс по country_id

Время выполнения 8 сек.

Ваше мнение?
 

zerkms

TDD infected
Команда форума
ты делаешь группировку для полумиллиона записей. и хочешь от мускула сверхпроизводительности при этом?
 

Mr_Max

Первый класс. Зимние каникулы ^_^
Команда форума
1. Кешируй запрос с максимально допустимым интервалом.
2. Храни результаты по
в отдельной таблице, выбирай от-туда.
 

NightFlash

Новичок
Кстати я уже достаточно давно нашел решение этой проблемы, хот я оно и кажется мне некрасивым, зато работает.

1. Выбираем все id курортов в которых есть туры. Делается это чисто по индексу (Using index for group by). Дальше на php превращаем эти id-шники в одну длинную строку через запятую, т.е. 4, 56,67, 39 и т.д.

2. Делаем запрос в таблицу курортов используя id IN(....)

все дело в том, что такой запрос сработает мгновенно, в отличие от вложенного Select ... In (Select)
Хотя на мой взгляд MySQL должен и сам разбивать запрос на 2 простых... но видимо делает иначе.
 
Сверху