- Поисковые системы
- Практика оптимизации
- Трафик для сайтов
- Монетизация сайтов
- Сайтостроение
- Социальный Маркетинг
- Общение профессионалов
- Биржа и продажа
- Финансовые объявления
- Работа на постоянной основе
- Сайты - покупка, продажа
- Соцсети: страницы, группы, приложения
- Сайты без доменов
- Трафик, тизерная и баннерная реклама
- Продажа, оценка, регистрация доменов
- Ссылки - обмен, покупка, продажа
- Программы и скрипты
- Размещение статей
- Инфопродукты
- Прочие цифровые товары
- Работа и услуги для вебмастера
- Оптимизация, продвижение и аудит
- Ведение рекламных кампаний
- Услуги в области SMM
- Программирование
- Администрирование серверов и сайтов
- Прокси, ВПН, анонимайзеры, IP
- Платное обучение, вебинары
- Регистрация в каталогах
- Копирайтинг, переводы
- Дизайн
- Usability: консультации и аудит
- Изготовление сайтов
- Наполнение сайтов
- Прочие услуги
- Не про работу
Маркетинг для шоколадной фабрики. На 34% выше средний чек
Через устранение узких мест
Оксана Мамчуева
Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий
Есть объект, он принадлежит разным категориям, ему присвоены разные цвета (несколько цветов сразу). Всего объектов более 100.000, у каждого в среднем по 4 категории и по 3 цвета.
Как правильно создать БД, чтобы потом можно было выбирать объект по этим параметрам достаточно быстро?
Была идея создать по каждому параметру (цвет, категории) отдельные таблицы, например, по категориям таблица с полями id_obj и id_category, поставить два индекса (id_obj и id_category). Ищет по такой таблице быстро, даже если записей 500.000
А если использовать поиск по категориям и цветам, то это поиск в двух таблицах - уже долго ищет.
Если сделать одну таблицу, где предусмотреть id_obj, id_category и id_color, то записей в ней будет примерно 100.000 * 4 * 3 = 1.200.000 причем часть данных будет повторяться, т.е. лишние данные. И поиск по такой толстой таблице тоже начинает тормозить - ведь данные постоянно добавляются.
P.s. MySQL это
не понял - у вас что, если обьект имеет две категории - то он дважды в базе?
иначе как обьяснить вашу фразу "у каждого в среднем по 4 категории и по 3 цвета"?
Есть одна таблица objects, где перечислены все объекты (название, id, дата добавления, количество просмотров, текстовое описание)
Таблица категорий - название и id
Таблица цветов - название и id
Каждый объект имеет по несколько категорий и несколько цветов - как правильно создать связи?
Раньше я всегда делал отдельные таблицы связей obj_cat, где прописывал id_obj и id_cat - таким образом можно каждому объекту присвоить несколько категорий или наоборот категориям-объекты.
Но если делать такие связи по нескольким таблицам, более двух, то поиск нужного объекта в БД занимает много времени.
касаемо "поиска в двух таблицах" - не знаю как это реализовано у вас, но если делаете двумя запросами то ознакомьтесь с возможностью сделать одним.
вот тут - MySQL.ru
Я как бы не совсем чайник, выбор данных из трех больших таблиц одним запросом занимает у меня много времени.
Если сделать одну большую таблицу с параметрами и выбрать из неё id_obj, а потом по этим id_obj выбрать данные по объектам - так получается быстрее, но все равно долго, около 1 сек. выполняется вывод данных в браузер(php).
Т.е. запрос
будет выполняться дольше, чем пара запросов
далее выбираем все объекты с id_obj из первого запроса
Select *From objects o where id_obj IN (список id_obj)
Вообще, крайне сложно определить, что будет работать быстрее — один сложный запрос или два простых. Точно это можно определить только на конкретных таблицах, запросах и объёмах данных.
А на глазок прикинуть можно только если вы подробно распишете структуру. И укажете, какие данные участвуют в поиске и выборке.
humbert, для ускорения поиска по параметрам можно попробовать так:
1. делайте отдельную таблицу сочетаний параметров combinations с полями:
id_combination|category|color
2. заполняйте ее всеми возможными, встречаемыми комбинациями (id_combination - автоинкремент).
3. в таблицу объектов добавьте поле-ссылку на нужную комбинацию параметров (id_combination).
Ну, грубо: id_object|name|desc|id_combination
Что дальше делать, думаю, понятно.
----
Сорри, стормозил. Не заметил, что категорий и цветов может быть одновременно несколько. Тогда стабильное решение - то, что в 3-м посте. По поводу тормозов надо смотреть план выполнения, может где индексов не сделали. Либо менять движок СУБД, либо наращивать железо, но это слишком банально.
Такая таблица есть, более 3 млн. записей получилось, около 400 Мб данных.
Слишком много повторов там, не полностью, но частчно данные повторяются.
Цветов и прочего много ? Если до 32, то битовая логика, на основе int типа поле и сравнения по нему.
Битовая логика происходит в десятки раз быстрее, чем вхождение таблиц.