Привет!
Есть "широкая" (~25 полей) таблица с товарами на 3 млн строк.
И есть таблица с привязкой товаров к брендами (~ 2,5 млн строк). Связь таблиц почти "один к одному".
Необходимо выбрать бренды товаров определенной категории.
Запрос выполняется 3-5 секунд:
SELECT ib.id_brand FROM item_tmp i
JOIN item_brand ib ON ib.id_item=i.aid
WHERE i.enabled=1
AND i.id_category BETWEEN 10107000 AND 10107999
GROUP BY ib.id_brand
ORDER BY null
Explain этого запроса:
Структура таблиц:
CREATE TABLE `item_tmp` (
`aid` int(11) NOT NULL AUTO_INCREMENT,
`id_category` int(11) NOT NULL,
`enabled` tinyint(1) NOT NULL,
...
и еще ~20 полей int и varchar
...
PRIMARY KEY (`aid`),
KEY `ce` (`id_category`,`enabled`) USING BTREE,
KEY `iec` (`aid`,`enabled`,`id_category`) USING BTREE,
KEY `cei` (`id_category`,`enabled`,`aid`) USING BTREE,
KEY `c` (`id_category`) USING BTREE
) ENGINE=InnoDB
CREATE TABLE `item_brand` (
`id_item` int(11) NOT NULL,
`id_brand` mediumint(9) NOT NULL,
KEY `ib` (`id_item`,`id_brand`)
) ENGINE=InnoDB
Сервер - SDD, 4GB RAM, 2 ядра.
Есть ли смысл разделить таблицу товаров на две:
1. несколько основных int-полей (по ним делать джойны и сложные выборки)
2. и остальные 20 текстовых полей (используется только для вывода в браузер)
Может ли помочь создание временной таблицы (create temporary table)?
Нужно ли использовать внешние ключи? (мало о них знаю).
Буду благодарен за советы.