Помогите с оптимизацией запроса

Patrul

Новичок
Помогите с оптимизацией запроса

Запрос наверное не сложный, но я не силен в MySQL
В кратце:
Есть две таблицы
PHP:
CREATE TABLE `price` (
  `id` bigint(20) NOT NULL auto_increment,
  `podrazdel` int(11) NOT NULL default '0',
  PRIMARY KEY  (`id`),
  KEY `podrazdel` (`podrazdel`),
) 

CREATE TABLE `podrazdel` (
  `id` int(11) NOT NULL default '0',
  `name_podrazdel` tinytext NOT NULL,
  PRIMARY KEY  (`id`),
  KEY `id_razdel` (`id_razdel`),
)
Мне нужно вывести все значения из `podrazdel`.`name_podrazdel`, которые присутствуют в `price`.`podrazdel`.

То есть если в `podrazdel`:
1 хлеб
2 мука
3 яйца

А в `price`:
1 1
2 1
3 3

То мне нужно получить "хлеб" и "яйца"
Пробовал так:
PHP:
SELECT `name_podrazdel` FROM `podrazdel` where `id`=(SELECT DISTINCT `podrazdel` from `price`)
но explain выводит, rows=3 из таблицы `price` Хотя, мне кажется что мог бы rows=2

Можно ли как-то оптимизировать данный запрос. Прошу сильно не пинать если чего не так, учусь ведь :)
 

Pigmeich

Новичок
А Оптимизация тут при чем?

Смотреть в сторону JOIN'ов и FOREIGN KEYs.
 

MurMyau

Новичок
Patrul,
вот так должно сработать:

PHP:
SELECT `name_podrazdel` FROM `podrazdel` where `id`IN (SELECT DISTINCT `podrazdel` from `price`)
А можно еще так:

PHP:
SELECT DISTINCT podrazdel.name_podrazdel FROM podrazdel INNER JOIN price ON podrazdel.id=price.podrazdel
 

Patrul

Новичок
Автор оригинала: MurMyau
Patrul,
вот так должно сработать:

PHP:
SELECT `name_podrazdel` FROM `podrazdel` where `id`IN (SELECT DISTINCT `podrazdel` from `price`)
А можно еще так:

PHP:
SELECT DISTINCT podrazdel.name_podrazdel FROM podrazdel INNER JOIN price ON podrazdel.id=price.podrazdel
Спасибо, второй вариант работает и rows через explain меньше чем в первом, но добавленная сортировка не работает
Поэтому первый вариант предпочтительней.
Спасибо!
 

Bitterman

Новичок
Спасибо, второй вариант работает и rows через explain меньше чем в первом, но добавленная сортировка не работает
Поэтому первый вариант предпочтительней.
Может лучше сделать так, чтобы сортировка заработала? Раз уж все равно учишься.
 

MurMyau

Новичок
Автор оригинала: Patrul
Спасибо, второй вариант работает и rows через explain меньше чем в первом, но добавленная сортировка не работает
Поэтому первый вариант предпочтительней.
Спасибо!
какая сортировка? почему не работает? Покажи код! И лучше оба варианта :)
 

Patrul

Новичок
сейчас перепроверил, точнее сортировка работает, но результаты explain следующие:
Без сортировки:
PHP:
id   select_type     table        type     possible_keys     key            key_len    ref                   rows     Extra
1    SIMPLE 	     podrazdel	ALL 	 PRIMARY           NULL           NULL       NULL                  67       Using temporary
1    SIMPLE          price        ref      podrazdel         podrazdel      4          test.podrazdel.id     15       Using index; Distinct
С сортировкой (ORDER BY podrazdel.name_podrazdel):
PHP:
id   select_type     table        type     possible_keys     key            key_len    ref                   rows     Extra
1    SIMPLE 	     price        index    podrazdel         podrazdel      4          NULL                  317      Using index; Using temporary; Using filesort
1    SIMPLE          podrazdel    eq_ref   PRIMARY           PRIMARY        4          test.price.podrazdel  1        Using index; Distinct
В таблице price пока 317 записей.
 

MurMyau

Новичок
Автор оригинала: Bitterman
Patrul
Хм, и что тебя смущает?
+1

В чем проблема? Результаты разные, потому по-разному запросы делаются...
Patrul, покажи полностью запросы и результаты, которые дает выборка - тогда разберемся
 

Patrul

Новичок
Возможно я не понимаю что такое rows в explain, насколько я знаю это показатель количества анализируемых строк при выполнении запроса.
Меня смущает что mysql просматривает все строки в таблице price и только одну в podrazdel.
просто расчитываю увеличить базу примерно до 1 млн. строк, не будет ли тормозов из-за этой самой сортировки.
Т.к. без нее mysql просматривает меньшее количество строк.

MurMyau, запрос в точности такой как ты написал ранее + сортировка:
PHP:
explain SELECT DISTINCT podrazdel.name_podrazdel FROM podrazdel INNER JOIN price ON podrazdel.id=price.podrazdel order by name_podrazdel
 

Bitterman

Новичок
Patrul
Т.к. без нее mysql просматривает меньшее количество строк.
Я не особо большой дока по EXPLAIN, но, насколько я понимаю, надо рассматривать произведение строк. То есть в первом случае у тебя получается 67*15, а во втором - 317*1. И?
 
Сверху