- Поисковые системы
- Практика оптимизации
- Трафик для сайтов
- Монетизация сайтов
- Сайтостроение
- Социальный Маркетинг
- Общение профессионалов
- Биржа и продажа
- Финансовые объявления
- Работа на постоянной основе
- Сайты - покупка, продажа
- Соцсети: страницы, группы, приложения
- Сайты без доменов
- Трафик, тизерная и баннерная реклама
- Продажа, оценка, регистрация доменов
- Ссылки - обмен, покупка, продажа
- Программы и скрипты
- Размещение статей
- Инфопродукты
- Прочие цифровые товары
- Работа и услуги для вебмастера
- Оптимизация, продвижение и аудит
- Ведение рекламных кампаний
- Услуги в области SMM
- Программирование
- Администрирование серверов и сайтов
- Прокси, ВПН, анонимайзеры, IP
- Платное обучение, вебинары
- Регистрация в каталогах
- Копирайтинг, переводы
- Дизайн
- Usability: консультации и аудит
- Изготовление сайтов
- Наполнение сайтов
- Прочие услуги
- Не про работу
Все что нужно знать о DDоS-атаках грамотному менеджеру
И как реагировать на "пожар", когда неизвестно, где хранятся "огнетушители
Антон Никонов
Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий
Есть основная запись, таблица. Допустим люди A.
У них есть набор опций B.
1. Есть такой вариант:
Таблица A
Таблица B
Таблица связей AB (a_id, b_id,value)
2. Есть такой вариант
Таблица A
Таблица B (особой роли не играет)
Текстовое поле в таблице A:
===========
b_id(1) = value
b_id(2) = value
b_id(3) = value
===========
В чем у меня проблема.Поиск может осуществляться сразу по нескольким полям и в результатах нужно показать значения всех полей.
В итог в первом варианте получается
LEFT JOIN AB as b1 ON (b1.id=a.id)
LEFT JOIN AB as b2 ON (b2.id=a.id)
LEFT JOIN AB as b3 ON (b3.id=a.id)
WHERE `b1.value`='value' OR `b2.value`='value' OR `b3.value`='value'
При большом количестве записей меня вся эта конструкция с кучей LEFT JOIN смущает совей производительностью
Во втором случае это просто
WHERE `option` LIKE 'pole1_value1%' OR `option` OR LIKE 'pole1_value1%' `option` OR LIKE 'pole1_value1%'
С одной стороны никаких join, с другой стороны LIKE c % тоже не лучший вариант.
Как все таки лучше поступить?
Индексы по a_id и b_id проставить и нормально будут джоины по производительности
Уж точно лучше лайков
Индексы по a_id и b_id проставить и нормально будут джоины по производительности
даже если таких join будет штук 10, а в основной таблице A под 200 000 записей и в таблице AB под миллион записей?
Ну, во первых, вам никто не мешает забить таблицу данными (рандом) и проверить
Во вторых, вот запрос, скажем, отрабатывает практически моментально на нормально настроенной базе. По количеству записей - category около 1000, products 25 000, product_catnum около 10 000, partsCategories 1 500 000, coordinates около двух миллионов
даже если таких join будет штук 10, а в основной таблице A под 200 000 записей и в таблице AB под миллион записей?
JOIN будет в любом случае работать быстрее LIKE, а если джойнить по индексам, то тут вообще без комментариев. Вам должно быть абсолютно пофиг на количество записей, если юзаются числовые индексы, главное на проблемы с LIMIT при большом отступе не напороться.
В чем у меня проблема.Поиск может осуществляться сразу по нескольким полям и в результатах нужно показать значения всех полей.
В итог в первом варианте получается
LEFT JOIN AB as b1 ON (b1.id=a.id)
LEFT JOIN AB as b2 ON (b2.id=a.id)
LEFT JOIN AB as b3 ON (b3.id=a.id)
WHERE `b1.value`='value' OR `b2.value`='value' OR `b3.value`='value'
При большом количестве записей меня вся эта конструкция с кучей LEFT JOIN смущает совей производительностью
Не совсем понятно, почему одного JOIN не достаточно?
При большом количестве записей меня вся эта конструкция с кучей LEFT JOIN смущает совей производительностью
Как вам выше написали - просто нужно правильно составить запрос. У вас свзят много-ко-многим - это вполне нормальная и работающая связь, проблем с ней не будет даже при миллионных записях, но запросы нужно будет составлять правильно, ез повторяющихся джойнов.
Самым лучшим будет вариант:
Таблица A
Таблица B
Таблица связей AB (a_id, b_id,value)
JOIN-ы по many-to-many таблицам работают гораздо быстрее чем запросы с LIKE. Для еще большего ускорения можно разбить один сложный запрос c JOIN-ами на несколько более простых. Грубо говоря, сначала вы получаете список ID пользователей, которые содержат нужные опции, а потом производите по ним выборку. Подобный подход применяется в Yii2.
Самым лучшим будет вариант:
JOIN-ы по many-to-many таблицам работают гораздо быстрее чем запросы с LIKE. Для еще большего ускорения можно разбить один сложный запрос c JOIN-ами на несколько более простых. Грубо говоря, сначала вы получаете список ID пользователей, которые содержат нужные опции, а потом производите по ним выборку. Подобный подход применяется в Yii2.
Подобный подход применяется при выборках с LIMIT OFFSET
dma84, будьте поаккуратней с limit offset. на больших значениях там начинается полный П. я однажды полдня потратил на поиски бага. http://stackoverflow.com/questions/4481388/why-does-mysql-higher-limit-offset-slow-the-query-down
dma84, будьте поаккуратней с limit offset. на больших значениях там начинается полный П. я однажды полдня потратил на поиски бага. http://stackoverflow.com/questions/4481388/why-does-mysql-higher-limit-offset-slow-the-query-down
Я использую JOIN или переменную-счётчик записей, но во втором случае обязательным условием является наличие всех столбцов в WHERE в составном индексе.