- Поисковые системы
- Практика оптимизации
- Трафик для сайтов
- Монетизация сайтов
- Сайтостроение
- Социальный Маркетинг
- Общение профессионалов
- Биржа и продажа
- Финансовые объявления
- Работа на постоянной основе
- Сайты - покупка, продажа
- Соцсети: страницы, группы, приложения
- Сайты без доменов
- Трафик, тизерная и баннерная реклама
- Продажа, оценка, регистрация доменов
- Ссылки - обмен, покупка, продажа
- Программы и скрипты
- Размещение статей
- Инфопродукты
- Прочие цифровые товары
- Работа и услуги для вебмастера
- Оптимизация, продвижение и аудит
- Ведение рекламных кампаний
- Услуги в области SMM
- Программирование
- Администрирование серверов и сайтов
- Прокси, ВПН, анонимайзеры, IP
- Платное обучение, вебинары
- Регистрация в каталогах
- Копирайтинг, переводы
- Дизайн
- Usability: консультации и аудит
- Изготовление сайтов
- Наполнение сайтов
- Прочие услуги
- Не про работу
VK приобрела 70% в структуре компании-разработчика red_mad_robot
Которая участвовала в создании RuStore
Оксана Мамчуева
Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий
Есть объект, он принадлежит разным категориям, ему присвоены разные цвета (несколько цветов сразу). Всего объектов более 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 типа поле и сравнения по нему.
Битовая логика происходит в десятки раз быстрее, чем вхождение таблиц.