[ Сообщений: 11 ] 
Начать новую тему Ответить на тему
Автор Сообщение
СообщениеДобавлено: 20 апр 2011, 19:26 
Аватара пользователя

Сообщения: 12
Поблагодарили: 0 раз.
Есть большая таблица предложений (товаров), не знаю как правильно извлекать из нее товары, чтобы не было запросов по несколько минут. В таблице находятся все товары из файла миксмаркет (более 2-х млн.).

Проблемы возникают, когда пытаюсь извлечь товары для корневых разделов. Например, если мы находимся на сайте в разделе "Бытовая техника", то необходимо сначала получить ID всех подкатегорий, а по ним извлечь все принадлежащие им товары.

Пробовал сначала так:
SELECT * FROM `offers` WHERE `category_id` IN (1000, 1001, 1002, 1003, .... 1100) LIMIT 0, 20
Индекс на `category_id` для товаров имеется. Но если передается больше десятка категорий, то запрос уже выполняется больше нескольких секунд.

Сейчас сначала делаю выборку категорий во временную таблицу, а потом уже через JOIN выбираю подходящие товары. Работает чуть бытрее, но все равно при большом количестве категорий довольно долго получается.

Проблема более-менее подавляется кэшированием выбранных товаров, но в планах подключать геотаргетинг и непонятно, как тогда извлекать. Ведь для разных пользователей в одной и той же категории будут разные запросы и разные товары. Получается и кэширование уже нельзя будет использовать.

Ситуацию усугубляют джоины, сортировки, фильтры для присоедененных таблиц. И здесь некоторые запросы могут выполняться до нескольких минут. С джоинами сделал так: сначала выбираю все необходимые товары, а затем для каждого из них делаю отдельный запрос для присоединения данных из других таблиц. Но как быть с сортировкой, пока не придумал.

В общем, буду очень признателен, если кто-то сможет ответить хотя бы на один из вопросов:

1. Как правильно извлекать из таблиц "WHERE `category_id` IN ()", если в IN (...) может быть до 100 значений?

2. Как можно опимизировать нижеприведенный запрос (составные индексы на `o`.`category_id`, `b`.`status`, `a`.`status` есть)? Есть какие-то альтернативные варианты?

SELECT
*
FROM
`offers` as `o`
LEFT JOIN `brands` as `b` ON `o`.`brand_id` = `b`.`id` // присоеденяем брэнды
LEFT JOIN `advertizers` as `a` ON `o`.`advertizer_id` = `a`.`id` // присоеденяем магазины
WHERE
`o`.`category_id` IN (...) // только товары в текущем разделе и во всех подразделах
`b`.`id` = 999 // только для текущего бренда
`b`.`status` = 1 // только для брэндов со статусом "1" (активен)
`a`.`status` = 1 // только для магазинов со статусом "1" (активен)
ORDER BY `o`.`price` ASC // сортируем по цене
LIMIT 0, 20

3. Где можно почитать, посмотреть, узнать, как вообще работают с большими таблицами? Ведь есть же сайты, где таблицы весят не 1-2ГБ, а десятки, сотни и записей больше 100 млн. И находят же какие-то решения.

Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 21 апр 2011, 14:48 
Сотрудник Миксмаркета
Аватара пользователя

Сообщения: 79
Поблагодарили: 1 раз.
Из таблицы OFFERS только селекты производятся? инсертов и апдейтов нет постоянных?
Цитата:
1. Как правильно извлекать из таблиц "WHERE `category_id` IN ()", если в IN (...) может быть до 100 значений?

Ваш вариант допустим.

Цитата:
2. Как можно опимизировать нижеприведенный запрос (составные индексы на `o`.`category_id`, `b`.`status`, `a`.`status` есть)? Есть какие-то альтернативные варианты?

покажите EXPLAIN запроса
А вообще, можно строить таблицу куда сразу складывать товары и бренды с нужными статусами и работать с ней


PS Надеюсь речь не о бесплатном хостинге? )

Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 21 апр 2011, 20:31 
Эксперт
Аватара пользователя

Сообщения: 276
Поблагодарили: 16 раз.
Нет смысла показывать товары всех подкатегорий в корневом разделе, их все равно никто не будет просматривать (например, используя пейджинг).
С выводом такого количества товаров всегда будут проблемы + геотаргетинг и соединения. Кешировать нельзя. Так зачем усложнять себе жизнь?

_________________
видеорецепты

Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 23 апр 2011, 09:02 
Аватара пользователя

Сообщения: 59
Поблагодарили: 5 раз.
Однозначно, что не стоит выводить в одном списке товары из категории и подкатегорий.
Но даже и в том случае, когда выводятся товары с подкатегориями, запросы не должны обрабатываться долго. Мой Вам совет: categoryID замените на более удобные ID, к примеру, можно задействовать маски.
Что такое маска. Пусть корневая категория имеет маску A, под категория в ней будет иметь маску AA, AB, AC и так далее. Подкатегория 3-его уровня вложенности: AAB,AAC,AAD и т.д. Преимущества в том, что зная маску - сразу можно сделать вывод (без апросов к базе данных) - какого уровня вложенности данная категория и какие маски у материнских категорий. Само собой, что индекс в этом случае работает лучше, нежели с INT-идентификаторами.
Если нужно выести товары и нужной категоии с включенными покатегориями, то в этом случае запрос будет типа:
SELECT * FROM offers WHERE mask LIKE 'ab%'
Само собой. что mask должен быть индексным полем.
Присоединения так же нужно делать по такому же полю mask. Работать будет тоже быстро.
Не стоит забывать о том, что нужно оптимизирвать и сам сервер (есил есть возможность), выделить необходимый размер под буфер ключей MySQL.

ДА, вот еще. По цене фильтровать по умолчанию - не стоит. Есть такие рекламодатели, которые телевизоры за 2 млн рублей выставляют за 2 рубля. И это длится очень долго. Не думаю, что это сулчайность, так как налицо эффективность такой рекламы.

Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 23 апр 2011, 21:14 
Эксперт
Аватара пользователя

Сообщения: 276
Поблагодарили: 16 раз.
MarquusGun писал(а):
Есть такие рекламодатели, которые телевизоры за 2 млн рублей выставляют за 2 рубля. И это длится очень долго. Не думаю, что это сулчайность, так как налицо эффективность такой рекламы.

Очень может быть, что не случайность.

Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 24 апр 2011, 09:50 
Аватара пользователя

Сообщения: 59
Поблагодарили: 5 раз.
Евгений писал(а):
Очень может быть, что не случайность.

Далеко ходить не стал, вот пример:
рекламодатель: Tele-market.ru
Товар: Samsung SyncMaster 820TSn-2
Цена в прайсе: 2 рубля
Цена на сайте рекла: 1910000 рублей

Таких товаров у него несколько, не все, однако, это уже длится на протяжении нескольких месяцев (загнул, наверное, на пару месяцев точно)

Боюсь, что нужно будет писать дополнительный анализатор цен и тех реклов, которые будут выбиваться из обей массы так резко - снимать с публикации локально.
Жаловаться в микс каждый раз - можно, но это тогда. когда заметишь, а если не заметил еще? тогда как раз и нужно все отсекать на автомате.

Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 03 май 2011, 19:26 
Аватара пользователя

Сообщения: 12
Поблагодарили: 0 раз.
[quote="ilyaska"]А вообще, можно строить таблицу куда сразу складывать товары и бренды с нужными статусами и работать с ней[/quote]
Это как? Что-то я не понял =)

[quote="MarquusGun"]Однозначно, что не стоит выводить в одном списке товары из категории и подкатегорий.[/quote]
Насчет однозначности не согласен - дело вкуса каждого. Но я подумаю над вашим мнением. Опять же, даже если выводить случайные товары из этих категорий, то необходимо получить все подкатегории (чтобы действительно случайные товары были), и запрос в итоге получится такой же.

[quote="MarquusGun"]Мой Вам совет: categoryID замените на более удобные ID, к примеру, можно задействовать маски...[/quote]
Вот это действительно стоящий совет! Переделал выборку с помощью масок и все теперь отлично, работает быстрее даже без кэша! Правда, как оказалось еще составные индексы не по всем полям составил. :)
Теперь можно о таргетинге задуматься и о карточках товаров. Вопрос, кстати, по карточкам: на 100% автоматизировать процесс слияния товаров не получится (если вообще имеет смысл). Подскажите, кто какой интерфейс использует, чтобы как можно меньше можно было времени тратить на слияние предложений к карточке товара. Понятно, что придется писать с нуля, просто ума сейчас не приложу, как это лучше реализовать (ведь придется постоянно лобавлять новые предложения и выбирать из них лучшее описание). Хотелось бы увидеть со стороны бэкенда как это выглядит (скриншот или часть страницы).
Как вариант, список предложений с чекбоксами напротив каждого, поле для текста описания товара (текст товара можно выбрать из предложений через radio button и отредактировать в поле). Те предложения, что выберем склеятся в один товар (таблица предложений и таблица товаров, связь первой таблицы ко второй по ключу productId. И выводить уже не предложения, а товары).

Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 03 май 2011, 21:25 
Аватара пользователя

Сообщения: 12
Поблагодарили: 0 раз.
Прошу прощения, что так поздно ответил. Из-за основной работы ели время нахожу сайтом заниматься )

Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 04 май 2011, 08:08 
Аватара пользователя

Сообщения: 59
Поблагодарили: 5 раз.
Lexx, я бы рекомендовал не опираться на описание и фотки реклов. Дело в том, что в описаниях реклов не всегда адекватный текст имеется. Мало ли что они там понапишут (Может телефон впиндюрят свой).
Я делаю так: описания и фотка на карточке - моя (имею ввиду, что не связана с реклом). За базис (источник, с которого это тырится) можно взять любой из обширных каталогов: Яндекс.Маркет, Товары.МайлРу..... Однако, поймите меня правильно, я не призываю тырить, это временное решение, оно просто ускоряет процесс очень сильно, в сотни раз!
ТАк вот, за базис берем 1 из каталогов. Каждая карточка в этом каталоге имеет как минимум 3 характеристики, по которым можно ее отличить от иных:
1) название модели
2)ID карточке в каталоге
3)ID категории в каталоге
В принципе, по Модели можно найти описание, фотку и ID карточки. Заливаем их на свой магаз (двигло), а потом привязываем реклов к той карточке. Безусловно, привязку ручками делать - это никакой жизни не хватит. Посему, перед привязкой, название товара прогоняем по своим фильтрам, дабы очистить от "мусорных" элементов и приводим к некоторому каноническому виду, который наиболее похож на тот, который в твоих карточках. КОнечно, сам вид и, соответсвтено, фильтр, будет сильно зависеть от категории товаров (группы: пылесосы, стиралки, фены, СВЧ печи....), но тут уж дело будет в тебе. Чем чётче фильтр отстроишь, чем он будет универсальней или же наоборот - точечнее - тембольше вероятность успеха в привязке (я называю это так, ты зовешь это, если я понял правильно, СЛИЯНИЕ).
Я не использую виртуальные карточки (созданные на лету) из-за их непостоянства, и следовательно, безконтрольности.

Если будут еще вопросы, задавай, рад буду помочь, коли мои советы помогают :)

P.S. Кстати, на счет 100 процентной автоматизации - да, ты прав, не получится, но если тебе цифра 100 не так важна, а скажем, 80% подойдет - то в этом случае автоматизация возможна. Сйечас я как раз такой вот автоматизацией и занимаюсь. У меня выводится Блок из 300 предложений реклов (тупым списком, сортировка только лишь по Имени Товара), а вот скрипт как раз и делает:
1) вычищает название товара от мусорных элементов
2) создает карточки товаров на атвомате, ели это возможно
3) соответственно фотки и описания тут же заливаются
4) привязываю к этим карточкам тех реклов. которые подходят исходя из результата работы фильтров пункта 1
5) Относит созданную карточку внужную категорию

Весь процесс сводится к тому, чтобы запустить скрипт и нажать кнопку СТАРТ. Ну и все в фоне делается, а ч лишь слежу за процессом. Конечно, тут уже затрагиваю иные ресурсы, то есть, не обхожусь только скриптом, но это дело уже времени.
Да, вот еще, периодически приходится очищать от дубликатов привязок, это когда один твоар привязан оказался к нескольким карточкам. Это не очень сложно, я просто очищаю привязки и запускаю сканер заново.
ТАк что, автоматизация возможна, она реальна. Советую только тебе разрабатывать именно свою, чтобы не попасть в зависимость от чужих наработок, так как они потом трудны в модернизации, если это, конечно же. потребуется.

Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 25 июн 2011, 17:01 
Аватара пользователя

Сообщения: 12
Поблагодарили: 0 раз.
MarquusGun, спасибо, очень подробно и познавательно. Сори, что опять долго ))). Можем с тобой связаться по аське или скайпу? Хочу показать свой сайт и, может быть, поделиться опытом. Последнее время, наконец-то, начал заниматься своим каталогом. Хочу довести до ума. Отправлю свой скайп в личку.

Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 30 апр 2012, 22:25 
Эксперт
Аватара пользователя

Сообщения: 276
Поблагодарили: 16 раз.
Lexx писал(а):
Где можно почитать, посмотреть, узнать, как вообще работают с большими таблицами? Ведь есть же сайты, где таблицы весят не 1-2ГБ, а десятки, сотни и записей больше 100 млн. И находят же какие-то решения.


В общем, если нельзя, но очень хочется, то все равно можно - sphinxsearch.com.
Можно делать в том числе и category_id IN (1000, 1001, 1002, 1003, .... 1100) LIMIT 0, 20, и получается очень быстро.
К слову, авито.ру построен на этом поисковом движке: вывод категорий, подкатегорий, фильтры, что угодно. Все летает при 6.5 млн объявлений и нагрузке в 2млн уников в сутки.

_________________
видеорецепты

Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему
 [ Сообщений: 11 ] 

   Похожие темы   Ответы   Автор   Просмотры   Последнее сообщение 
В этой теме нет новых непрочитанных сообщений. Надпись "реклама" над блоками товаров

[ На страницу: 1, 2 ]

в форуме Микс-Товары

17

mariaonline

12486

31 окт 2014, 08:50

Odaria Перейти к последнему сообщению

В этой теме нет новых непрочитанных сообщений. Не могу настроить блок "Контекстных товаров" (2448

в форуме Микс-Товары

6

moreinfo

12208

01 мар 2010, 13:40

mager Перейти к последнему сообщению

В этой теме нет новых непрочитанных сообщений. Нужны более гибкие настройки шаблонов «Контекстных товаров»

в форуме Микс-Товары

3

BOOTKiller

11729

12 май 2006, 15:42

ivanov Перейти к последнему сообщению

В этой теме нет новых непрочитанных сообщений. «Описание на сайте продавца» (в xml вместо описания товаров)

в форуме Микс-Товары

7

Sinister

15706

25 апр 2012, 04:56

Spawn Перейти к последнему сообщению

В этой теме нет новых непрочитанных сообщений. Оптимизация стоимости клика и расширение базы товаров

в форуме Микс-Товары

1

Odaria

6949

08 дек 2014, 23:20

Корнелий Перейти к последнему сообщению



Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения
cron


О проекте Новости Пресса о нас Сотрудничество Вакансии Контакты
2005–2011 Партнерская сеть Миксмаркет
Разработка сайта — iji-design / AdLabs
Powered by phpBB Group