- Поисковые системы
- Практика оптимизации
- Трафик для сайтов
- Монетизация сайтов
- Сайтостроение
- Социальный Маркетинг
- Общение профессионалов
- Биржа и продажа
- Финансовые объявления
- Работа на постоянной основе
- Сайты - покупка, продажа
- Соцсети: страницы, группы, приложения
- Сайты без доменов
- Трафик, тизерная и баннерная реклама
- Продажа, оценка, регистрация доменов
- Ссылки - обмен, покупка, продажа
- Программы и скрипты
- Размещение статей
- Инфопродукты
- Прочие цифровые товары
- Работа и услуги для вебмастера
- Оптимизация, продвижение и аудит
- Ведение рекламных кампаний
- Услуги в области SMM
- Программирование
- Администрирование серверов и сайтов
- Прокси, ВПН, анонимайзеры, IP
- Платное обучение, вебинары
- Регистрация в каталогах
- Копирайтинг, переводы
- Дизайн
- Usability: консультации и аудит
- Изготовление сайтов
- Наполнение сайтов
- Прочие услуги
- Не про работу
Тренды маркетинга в 2024 году: мобильные продажи, углубленная аналитика и ИИ
Экспертная оценка Адмитад
Оксана Мамчуева
В 2023 году Одноклассники пресекли более 9 млн подозрительных входов в учетные записи
И выявили более 7 млн подозрительных пользователей
Оксана Мамчуева
Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий
В запросе БД может использовать только 1 индекс, всегда только один, и выбирает максимально оптимальный.
+1
Правда, есть такое понятие, как слияние индексов.
Ну и не всегда планировщик выбирает оптимальный индекс.
А составные должны быть точто в таком же порядке как и в выражения where.
Это не так. :)
в теории (ведь это реляционная БД) вам не должно понадобиться такое количество индексов в рамкох одной таблицы.
Что это за такая теория? :)
А вот перестраивать индексы в большой таблице при insert/update/delete может стать огромной проблемой
+1.
Даже в относительно маленькой таблице (2 ГБ) инсерты начинают тупить при добавлении каждого дополнительного индекса.
---------- Добавлено 25.01.2017 в 09:59 ----------
Приложение: представьте себе таблицу с параметрами товаров (как я выше писал их сейчас 14), юзер видит эту таблицу у себя в браузере. Юзеру дается возможность фильтровать и/или сортировать по любому столбцу. Я так считаю, что в данном случае на каждый такой столбец нужно по индексу.
Сколько записей в таблице?
Если записей мало, то планировщик может решить, что быстрее считать таблицу, чем копаться в индексах. :)
Смотрите, короче, EXPLAIN самых частых запросов.
Товары, я так понял, все однотипные?
Характеристики однотипных товаров можно хранить в одной таблице.
Характеристики же разнотипных товаров нужно выносить в отделюную таблицу.
А также почитайте о таком понятии, как cardinality индекса.
Если поле принимает только 2 значения, то индекс ставить на него смысла нету.
Индексы нужно ставить на поля, по которым происходят JOIN.
И мы получим в 18 раз большую таблицу. Правда с одним индексом, что хорошо, но при добавлении-изменении-удалении товара надо будет править 19 строк вместо одной, что плохо. И это решение будет нормальным, если джоинов мало (например фильтр по одному-двум-трем параметрам). А если фильтр по 10 параметрам? База загнется от такого запроса.
C какого перепуга 18 раз больше? всего то три таблицы, в одно хранятся параметры. Они редко изменяются, и таблица меленькая. В дргой товары , в третей связь первых двух и значение
В итоге в таблице товаров будет вместо 18 полей - пусто, а править таблицу много-ко-многим не так и сложно и там всего один индекс будет.
Где вы тут увидели в 18 раз большую таблицу?
---------- Добавлено 25.01.2017 в 12:14 ----------
кроме того, что объем данных это не уменьшает, так ещё и типы данных могут быть разными, что может вызвать определенные неудобства или необходимость извращаться.
ну по объему спорно. вместо 18 полей и 18 индексов, всего то таблица с 3 полями и одним индексом. Да по количеству записей она будет больше, но с другой стороны - поиск и запись в такую таблицу будут работать намного шустрее. Так что вопрос по количеству открыт.
Ну а с типами данных - тоже сомневаюсь, обычно параметры можно впихнуть в текстовое поля и все. Это же не сервис, а всего то магазин и под параметры товаров.
Причем поиск (фильтры) при такой раскладке намного проще устроить - сразу есть таблица откуда имена и id этих фильтров брать и не нужно таблицу товаров дергать лишний раз.
Где вы тут увидели в 18 раз большую таблицу?
Я имел ввиду количество строк. Мне такое решение с вынесом атрибутов в отдельную таблицу не нравится.
А я бы вообще пошел другим путем:
1) Параметры товаров оставил бы в самих товарах, но без индексов - так проще и удобней для большинства операций с товарами.
2) Выборку товаров с сортировкой и фильтрацией вынес бы в отдельную независимую систему - отдельный фронтэнд например на elasticsearch.
А также почитайте о таком понятии, как cardinality индекса.
Если поле принимает только 2 значения, то индекс ставить на него смысла нету.
Ясно, спасибо! А если не два значения, а, допустим, 6? У меня есть несколько INT колонок с таким количеством вариантов (включая вариант Null).
Про кардиналити почитаю, спасибо!
А если не два значения, а, допустим, 6? У меня есть несколько INT колонок с таким количеством вариантов
Например, если у вас в большинстве случаев по другим параметрам хорошо создаются компактные выборки, то индекс на эти колонки (с малым количеством вариантов) выглядит сомнительным.
C какого перепуга 18 раз больше?
Все может быть. Групп товаров может быть много, у каждой группы свои параметры
Товар 1 - 5 параметров, Товар 2 - 18 параметров (как в примере, но фильтр на 18 параметров в топку), Товар 3 - 7 параметров....
Можно для фильтра таблицу фильтр: ид товара - ид параметра - значение параметра. Рабочий вариант. Другой вариант - для каждого товара своя таблица, каждая из которых может быть сильно меньше таблицы фильтр (и в 18 раз в том числе). В результате моих тестов, для что то около 50 групп товаров, динамические таблицы на каждый из них пока впереди.
Хотя можно и ниже опуститься 50 таблиц товар + 50 таблиц фильтр😂
Например, если у вас в большинстве случаев по другим параметрам хорошо создаются компактные выборки, то индекс на эти колонки (с малым количеством вариантов) выглядит сомнительным.
Мысль ясна. Однако, юзер может захотеть фильтрануть или поискать и по этим колонкам (с малым количеством возможных вариантов). Я так понимаю, при больших размерах таблицы такие выборки без индексов могут стать проблемой?
Я так понимаю, при больших размерах таблицы такие выборки без индексов могут стать проблемой?
Если у вас миллион товаров, то это конечно может стать проблемой.
А вообще если у вас самопис, то я бы вообще не извращался со структурой хранения товаров и его параметров. Если вас наиболее устраивает хранение параметров товара в одной таблице с товаром (в виде полей), то так и оставляйте. Ведь так работать с товаром намного удобней и эффективней: большинство операций с товаром будет выполняться максимально быстро и просто - одним запросом. Логика работы с товарами также будет максимально простой, в отличие от дробления товара на кучу таблиц с резким усложнением логики работы с товарами.
А вот сложную выборку товаров с фильтрами, сортировками и прочими рюшечками вынесите в отдельную изолированную подсистему, чтобы она вообще при желании могла работать на отдельном сервере. В этой подсистеме уже создавайте любой число таблиц с любой структурой, которая позволит вам максимально просто решить вашу задачу. Эти таблицы разумеется надо будет синхронизировать с таблицей товаров. И даже если эта хрень загнется, основной сайт продолжит работу. Более того, как я посоветовал ранее, в качестве движка такой подсистемы вы можете выбрать какой-нибудь готовый гибкий поисковый движок.
А вообще если у вас самопис, то я бы вообще не извращался со структурой хранения товаров и его параметров.
Хм, как раз в самописи можно настроить все как нужно :)
Вот Вы и сами ниже насоветовали. :)