Добрый день. Делаю "магазин", есть товары, рассортированы по категориям, типа:
Таблица товаров:
CREATE TABLE goods (
id INT UNSIGNED NOT NULL AUTO_INCREMENT,
_data JSON NOT NULL,
_cat INT UNSIGNED NOT NULL,
PRIMARY KEY (id)
) DEFAULT CHARSET=utf8;
Таким запросом я получаю все категории товаров и их количество (библиотека safemysql):
$cats = $db->getAll('
SELECT _cat, COUNT(*) as _cnt
FROM goods
GROUP BY _cat
');
В цикле _cat сверяю в массивом категорий прописанным в php и вывожу дополнительную информацию. Я знаю что это далеко не правильный метод работы с категориями, поэтому продолжу.
Есть же второй вариант, который должен быть значительно лучше. Это создать таблицу категорий и столбцу _cat присваивать идентификатор категории из другой таблицы, а потом выводить примерно так:
$cats = $db->getAll('
SELECT COUNT( g.id ) as _cnt, c.*
FROM cats c
LEFT JOIN goods g
ON g._cat = c.id
GROUP BY g._cat
');
Пока что не тестировал второй запрос, написал на глаз. На счет GROUP BY не уверен, но вроде нужен.
Так вот, есть второй вариант, хранить все категории с нужными данными в таблице и потом при помощи запроса делать сразу подсчет.
Сейчас у меня тестовая таблица товаров, там около 1 млн. записей. Когда в таблице меняется как-то значение, то при первой загрузке сайта он может несколько секунд грузиться (потом, видимо, кешируется), и вот вопрос в том, на сколько может подняться производительность, если реализовать выборку по второму варианту? И есть ли еще более быстрый вариант?