Вывод производителей текущей категории из всей таблицы товаров

Гриша К.

Новичок
Вывод производителей текущей категории из всей таблицы товаров

Здравствуйте.

Есть таблица товаров. Структура в кратце:
[sql]
CREATE TABLE `catalog_product` (
`product_id` int(11) NOT NULL auto_increment,
`category_id` int(11) NOT NULL default '0',
`firm_id` int(11) NOT NULL default '0',
PRIMARY KEY (`product_id`),
KEY `category_id` (`category_id`),
KEY `firm_id` (`firm_id`)
) ENGINE=InnoDB;
[/sql]

При выводе товаров по определенной категории, выводится список производителей текущей категории и подкатегорий. Запрос в кратце:
[sql]
SELECT
catalog_firm.firm_id,
firm_name
FROM
catalog_product,
catalog_firm
WHERE
catalog_product.firm_id = catalog_firm.firm_id AND
category_id IN(2, 0, 5, 6, 7, 8, 9, 10, 11, 12 )
GROUP BY firm_id
[/sql]

EXPLAIN (реальный, по описанному выше запросу. Всего записей в таблице "catalog_firm" - 11, в таблице catalog_product - 104):
PHP:
id | select_type | table              | type	   | possible_keys       | key     | key_len  | ref                        | rows | Extra  
1  | SIMPLE	  | catalog_firm	   | index 	 | PRIMARY 		    | PRIMARY | 4        | NULL 		              | 12   |
1  | SIMPLE	  | catalog_product    | ref 	   | category_id,firm_id | firm_id | 4        | b9804.catalog_firm.firm_id | 6    | Using where
Время выполнение запроса (на хостинге) колеблится от 0,0005 сек до 0,0034 сек (Иногда выдовалов 0,092 сек - при первом запросе).

----------------------------
У меня появились сомнения по поводу таких запросов, предположив что в таблице "catalog_firm" может быть 100 записей, а в "catalog_product" - 10000 записей.
Вот насколько нормально и эффективно использовать запросы такого вида? Правилен ли такой запрос, можно ли его использовать.

P.S. Запрос схожий с этим, используется также при выводе спика опций товаров (фильтр), в таком случае значения опций извлекаются только если они существуют минимум для одного товара.
 

_Leonchik_

Новичок
Столбец ref показывает, какие столбцы или константы используются с ключом, указанным в key, для выборки строк из таблицы.
А там NULL - делаем выводы.

Потом:
type -> index
Данный тип аналогичен ALL, за исключением того, что просматривается только дерево индексов. Этот тип обычно более быстрый чем ALL, поскольку индексный файл, как правило, меньше файла данных.

ты пишешь: Всего записей в таблице "catalog_firm" - 11
в Експлайне пишет 12.

Тобишь, читает всю таблицу.

Ошибаюсь?
 

Гриша К.

Новичок
_Leonchik_, спасибо аз ответ.

Скорее всего получается, что читает всю таблицу. Прочитал щас про EXPLAIN. Но не читает всю таблицу "catalog_product", а почему же тогда читает всю таблицу "catalog_firm"?

Возможно есть какие-то решения по оптимизации запроса?
 

_Leonchik_

Новичок
почему же тогда читает всю таблицу "catalog_firm"?
вот загадка!
потому что оптимизатор долбанный не нашел подходящего ключа для твоего запроса к таблице catalog_firm
думай. смотри. читай.

-~{}~ 13.02.07 20:37:

да. а как Джойны себя ведут при подобном запросе?

-~{}~ 13.02.07 20:51:

ну что там с Джойнами?
спортивный интерес ё маё или где?

-~{}~ 13.02.07 20:54:

упс. при IN ( 2, 0, 5, 6, 7, 8, 9, 10, 11, 12 ) - это конечно он будет читать всю таблицу.
Но могу и ошибатся. но кажись в мане об этом написано.
 

flash-vkv

Новичок
Гриша К. я бы попробовал составной индекс firm_id , category_id . но наверно врятли, потому еше попробовал бы оставить тока firm_id а category_id убрал вобше. в общем метод научного самый научный. и еше указывал бы всеже полностью поля к примеру GROUP BY catalog_product.firm_id , так на всякий пожарный даже если работает

-~{}~ 14.02.07 02:15:

читает всю таблицу потому-что у тебя условие стоит по двум полям один из которых с IN плюс еше по одному из полей группировка.
 
Сверху