У меня в основной таблице товаров около 25 полей, и 10 из них - это TEXT (в них лежат данные размером до 1000 символов). Как вы порекомендуете поступить? Изменить эти поля на VARCHAR или вообще вынести в отдельную таблицу?
Можете чуть подробнее пояснить про денормализованную форму для фильтров? У меня сейчас классический нормализованый вариант из трех таблиц: item, brand, item_brand. И такие наборы для каждого фильтра - цвет, бренд... Как эти связи можно по другому хранить?
Разобрался, такое решение работает: INSERT INTO items (id, id_shop, name, description) SELECT id, id_shop, name, description FROM new_items ON DUPLICATE KEY UPDATE name = new_items.name, description = new_items.description. Спасибо большое за помощь!
Попробовал ваш запрос, ругается на последнюю строку: ON DUPLICATE KEY UPDATE `name` = `new_name`.... Говорит new_name не определен в списке полей. Как бы этот вложенный SELECT вынести наружу?
Сайт старый, кардинально переделывать структуру нерезон. Движок самописный. На сайте используются как ЧПУ так и вот такие простые URL (file.php?param=val). Страницы попали в индекс Яндекса видимо из-за ошибки движка (сгенерировались вложенные адреса типа: site.ru/file.php/img/photo1.jpg и т.п.). Ошибку уже поправили, но так как страницы не возвращают 404 - то Яндекс их упорно не хочет выкидывать из индекса. Получаются дубли-страниц и для SEO это не очень хорошо.
RoverWhite: Кажется понимаю ошибки в проектировании данных, нужно мне вложенность категорий товаров переделать, чтобы подкатегории выбирать простым ...id_category BETWEEN 2000 AND 2999... и избавиться от медленных IN (...). Думаю часть проблемы с производительностью это решит. Верно?
RoverWhite: сейчас поэкспериментировал, даже одиночный запрос из item: SELECT * FROM item WHERE enabled=1 AND id_category IN (6,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,203,288,308,309) - выполняется 6 секунд. Это нормально, как вы считаете?
RoverWhite: Поясню, на item.id можно не обращать внимание, там хранится всякий "мусор", не участвующий в запросах. Связи идут через уникальное поле item.aid
1. item имеет только один brand, да, его можно перенести в таблицу. Но на странице есть и другие подобные фильтры "один ко многим" (фильтр по цвету, по размеру).
2. На таблице Item присутствуют обычные неуникальные индексы (id_category, enabled,...). Каждый индекс на отдельное поле.
На странице 10-15 sql-запросов. Я думал что 120мс - это отличный результат, а вы меня расстроили ))