![]() |
Модераторы: skyboy, MoLeX, Aliance, ksnk |
![]() ![]() ![]() |
|
niibaca |
|
|||
Новичок Профиль Группа: Участник Сообщений: 12 Регистрация: 24.1.2008 Репутация: нет Всего: нет |
Итак, следующая ситуация.
Есть 2 таблицы. Одна с ценами на товар, регулярно обновляется (100-300 тыс. строк). А другая с моделями этого товара (несколько десятков тыс. строк). Для каждой модели мне надо знать кол-во предложений и минимальную цену. Делаю это следующим образом. Беру название модели, засовываю в LIKE и пробегаю по названиям прайсовых строк в первой таблице. На обновление информации для каждой модели уходит 0.6 секунды. В перспективе моделей может быть 100 000. То есть на обновление будет уходить сутки!! Думал полнотекстовый поиск по индексу меня спасет, но он выдает совершенно неправильные результаты, а мне нужно строгое соответствие. Что посоветуете в данной ситуации? Какие приемы? Может использовать другую БД? Или другую структуру? Это сообщение отредактировал(а) niibaca - 28.1.2008, 01:58 |
|||
|
||||
SelenIT |
|
|||
![]() баг форума ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3996 Регистрация: 17.10.2006 Где: Pale Blue Dot Репутация: 9 Всего: 401 |
Нафиг в таблице с ценами название модели? По логике, там должен быть ее id. И вообще, я так и не понял, что и где обновляется, когда задача сформулирована как
-------------------- Осторожно! Данный юзер и его посты содержат ДГМО! Противопоказано лицам с предрасположенностью к зонеризму! |
|||
|
||||
niibaca |
|
|||
Новичок Профиль Группа: Участник Сообщений: 12 Регистрация: 24.1.2008 Репутация: нет Всего: нет |
Таблица с ценами - это распарсенные xml из разных источников.
Так понятнее? |
|||
|
||||
SelenIT |
|
|||
![]() баг форума ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3996 Регистрация: 17.10.2006 Где: Pale Blue Dot Репутация: 9 Всего: 401 |
Немного, но хорошо бы привести полную структуру и примеры хотя бы пары типичных строчек для обеих таблиц.
Кстати, как связаны между собой "товар" и "модели"? -------------------- Осторожно! Данный юзер и его посты содержат ДГМО! Противопоказано лицам с предрасположенностью к зонеризму! |
|||
|
||||
niibaca |
|
||||
Новичок Профиль Группа: Участник Сообщений: 12 Регистрация: 24.1.2008 Репутация: нет Всего: нет |
Пример таблицы товары (offers)
of_id | of_name | of_price 123 | Nokia N95 | 567 345 | Apple iPhone | 1030 432 | Nokia 6300 | 234 Пример таблицы каталог (models) md_id | md_brand | md_name | md_amount | md_bestprice 123 | Nokia | N73 | 5 | 678 345 | Nokia | N82 | 10 | 567 432 | Nokia | N95 | 7 | 563 Вот скрипт, который отвечает за обновление.
Добавлено через 2 минуты и 35 секунд Самое узкое место получается здесь:
На выборку из 100 000 строк уходит 0.6 секунды. |
||||
|
|||||
SelenIT |
|
|||
![]() баг форума ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3996 Регистрация: 17.10.2006 Где: Pale Blue Dot Репутация: 9 Всего: 401 |
Имхо, поля md_amount и md_bestprice в таблице models не нужны - их всегда можно посчитать в запросе на выборку. А вместо поля of_name я бы писал в таблицу offers значение md_id, соответствующее данной модели (получая его при добавлении данных, на этапе парсинга XML прайсов). Тогда нужная выборка делалась бы очень просто:
С правильными индексами должно работать очень быстро, тем более результаты частых запросов MySQL кеширует... -------------------- Осторожно! Данный юзер и его посты содержат ДГМО! Противопоказано лицам с предрасположенностью к зонеризму! |
|||
|
||||
niibaca |
|
|||
Новичок Профиль Группа: Участник Сообщений: 12 Регистрация: 24.1.2008 Репутация: нет Всего: нет |
Спасибо, завтра попробую.
Только я не очень хорошо себе представляю, как найти по названию товара в прайсе модель из каталога. Когда в названии в прайсе стоит только "Nokia N95", то найти просто, а вот если "Сотовый телефон Nokia N95 красный"? |
|||
|
||||
SelenIT |
|
|||
![]() баг форума ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3996 Регистрация: 17.10.2006 Где: Pale Blue Dot Репутация: 9 Всего: 401 |
Имхо, можно разбивать по словам и искать как-то наподобие
Для ускорения можно завести массив типичных классов товаров ("Сотовый телефон" и т.п.) и перед разбивкой их просто отрезать... -------------------- Осторожно! Данный юзер и его посты содержат ДГМО! Противопоказано лицам с предрасположенностью к зонеризму! |
|||
|
||||
skyboy |
|
|||
неОпытный ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9820 Регистрация: 18.5.2006 Где: Днепропетровск Репутация: 14 Всего: 260 |
а как насчет того, чтоб документы присылали корректно оформленными? или на источники данных ты не влияешь?
|
|||
|
||||
niibaca |
|
|||
Новичок Профиль Группа: Участник Сообщений: 12 Регистрация: 24.1.2008 Репутация: нет Всего: нет |
skyboy, не влияю.
|
|||
|
||||
niibaca |
|
|||
Новичок Профиль Группа: Участник Сообщений: 12 Регистрация: 24.1.2008 Репутация: нет Всего: нет |
Снова занялся этой проблемой, попробовал Ваш вариант. Он не подходит, если модель состоит из 2 слов. Например, Canon EOS 350D Тогда он ищет IN('EOS', '350D') и конечно же ничего не находит. Как еще можно подобный поиск выполнить без Like? |
|||
|
||||
![]() ![]() ![]() |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | PHP: Базы Данных | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |