
Новые сообщения [новые:0]
Дайджест
Горячие темы
Избранное [новые:0]
Форумы
Пользователи
Статистика
Статистика нагрузки
Мод. лог
Поиск
|
|
03.04.2014, 12:09:15
|
|||
|---|---|---|---|
|
|||
Помогите оптимизировать запрос |
|||
|
#18+
Доброго времени суток. Есть такая задача: Есть следующие таблицы: category: id, parent_id, title ... filters: id title, parent_id, category_id ... product: id, title, category_id product_filter: id, product_id, filter_id В двух словах: фильтры привязываются к категориям товаров. И друг к другу. Т.е. есть родительский фильтр (типа категории фильтров) и дочерние - фильтр, которые можно непосредственно задать для товара. В таблице product_filter соответственно связи между фильтрами и товарами. Название товара состоит из названия производителя и модели. Т.е. например товар Italtherm City Basic 18 F. "Italtherm" - производитель, "City Basic 18 F" - модель. В таблице фильтров есть "категория фильтров" производитель, и для товара выбирается фильтр "производитель". Т.е. для данного примера в таблице фильтров будет категория фильтров "производитель", привязанная к категории товара и для неё дочерний фильтр "Italtherm", для которого в таблице product_filter будет связь с товаром. Нужно организовать поиск по товарам следующим образом. Входные данные - некая строка символов". Нужно от исходного названия "Italtherm City Basic 18 F" отрезать название производителя, выбрав его из таблицы фильтров. Получится "City Basic 18 F". И уже по этому полю искать LIKEом. Сам я написал вот такой запрос: Код: sql 1. 2. 3. 4. 5. Она работает медленно очень. Подскажите, можно ли как-то по-другому запрос написать, чтобы работало быстрее? P.S. Просьба не отвечать в стиле "та тут структура хреновая. Надо было ...". Задача в том, чтобы с этой структурой сделать что-то человеческое. Заранее спасибо за ответ =) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
03.04.2014, 12:18:02
|
|||
|---|---|---|---|
Помогите оптимизировать запрос |
|||
|
#18+
Просмотрел бегло... 1) Конструкцию IN (SELECT ...) переписывайте через JOIN или EXISTS. Да и вообще подзапрос в условии соединения - нужно очень хорошо понимать что делаешь, иначе велики шансы породить химеру. 2) LIMIT без ORDER BY - вам все равно, какие именно 10 строк будут в результате? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
03.04.2014, 16:03:59
|
|||
|---|---|---|---|
|
|||
Помогите оптимизировать запрос |
|||
|
#18+
miksoft, Поменял IN (...) на join и exist... Заработало в 7 раз быстрее=) Спасибо огромное Вам за совет. Очень помогло По ORDER BY - как не странно, но здесь действительно всё равно, какие конкретно 10 записей) Ещё раз спасибо) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
03.04.2014, 16:06:08
|
|||
|---|---|---|---|
Помогите оптимизировать запрос |
|||
|
#18+
froostyПоменял IN (...) на join и exist... Заработало в 7 раз быстрее=) Спасибо огромное Вам за совет. Очень помоглоПоказывайте. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
03.04.2014, 16:09:23
|
|||
|---|---|---|---|
Помогите оптимизировать запрос |
|||
|
#18+
Она работает медленно очень. Подскажите, можно ли как-то по-другому запрос написать, чтобы работало быстрее? МОЖНО! P.S. Просьба не отвечать в стиле "та тут структура хреновая. Надо было ...". Не отвечал. Заранее спасибо за ответ =) Да пожалуйста! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
03.04.2014, 16:15:45
|
|||
|---|---|---|---|
Помогите оптимизировать запрос |
|||
|
#18+
FROM `product` left join `filters` ... Уже можно уржаться до колик. А там ещё Limit. Да, товарищь, тебе не бд надо советовать переделывать, тебе надо SQL учить сначала, потом только бд переделывать уже. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
03.04.2014, 23:04:54
|
|||
|---|---|---|---|
|
|||
Помогите оптимизировать запрос |
|||
|
#18+
miksoft, Сделал так: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. Смущает несколько то, что таблицу filters дважды присоединяю, но что-то я не могу придумать, как это изменить =( ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
03.04.2014, 23:10:05
|
|||
|---|---|---|---|
|
|||
Помогите оптимизировать запрос |
|||
|
#18+
MasterZiv, MasterZivFROM `product` left join `filters` ... Уже можно уржаться до колик. А там ещё Limit. Да, товарищь, тебе не бд надо советовать переделывать, тебе надо SQL учить сначала, потом только бд переделывать уже. Очень содержательно, а главное действительно мне помогло. А Вы наверное родились с безупречными знаниями всех технологий и Вам неведомо, что такое учиться. Откровенно говоря, да, я на столько туп, что даже не понял, что Вас так рассмешило. Но хорошо, что мой вопрос подарил Вам смех. Я надеюсь, что Вам стало проще жить, ибо тогда Ваш ответ имел бы хоть какой-то смысл. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
04.04.2014, 08:30:42
|
|||
|---|---|---|---|
Помогите оптимизировать запрос |
|||
|
#18+
froosty, Да слезы он подарил. Left join тебе никогда ничего не отфильтрует. Он этого в принципе это не делает. Он только может множить записи. И после этого ты ещё limit добавляешь, чтобы совсем не было видно, что же запрос отбирает. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
04.04.2014, 08:44:51
|
|||
|---|---|---|---|
Помогите оптимизировать запрос |
|||
|
#18+
MasterZiv, Короче. Запрос твой— бред сивой кобылы. Переписанный запрос, я подозреваю, тоже, поскольку в изначальном запросе количество бреда зашкаливает. Что он работает быстрее — случайность. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
04.04.2014, 08:52:34
|
|||
|---|---|---|---|
Помогите оптимизировать запрос |
|||
|
#18+
MasterZiv, Сколько записей в таблице product? До порядка 10 тысяч это ещё как то может будет работать, больше — просто умеет. Идея базовая дурацкая. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
04.04.2014, 11:25:34
|
|||
|---|---|---|---|
|
|||
Помогите оптимизировать запрос |
|||
|
#18+
MasterZiv, На данный момент около 6000 записей. Ну объясните, как делать так, чтобы было по человечески. Сейчас изменил запрос, убрал LEFT JOIN, EXISTS, и сделал с помощью INNER JOIN. Работать стало ещё быстрее. В принципе, после последних исправлений, скорость работы запроса меня устраивает. Но на будущее, если не сложно, объясните, как нужно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
04.04.2014, 11:40:37
|
|||
|---|---|---|---|
Помогите оптимизировать запрос |
|||
|
#18+
froostyРаботать стало ещё быстрее Код: sql 1. работает ещё быстрее; может, вам стОит использовать именно этот запрос? если всё дело только в скорости выполнения... froostyНо на будущее, если не сложно, объясните, как нужно.froostyПросьба не отвечать в стиле "та тут структура хреновая. Надо было ...".Так вам шашечки надо или ехать? :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
04.04.2014, 12:16:03
|
|||
|---|---|---|---|
Помогите оптимизировать запрос |
|||
|
#18+
froostyMasterZiv, На данный момент около 6000 записей. Ну объясните, как делать так, чтобы было по человечески. Сейчас изменил запрос, убрал LEFT JOIN, EXISTS, и сделал с помощью INNER JOIN. Работать стало ещё быстрее. В принципе, после последних исправлений, скорость работы запроса меня устраивает. Но на будущее, если не сложно, объясните, как нужно. Берем сухой остаток: Нужно организовать поиск по товарам следующим образом. Входные данные - некая строка символов". Нужно от исходного названия "Italtherm City Basic 18 F" отрезать название производителя, выбрав его из таблицы фильтров. Получится "City Basic 18 F". Название товара состоит из двух частей, которые хочется обрабатывать независимо. Так? А что это значит? А это значит, что тут налицо нарушение первой нормальной формы таблицы. И таки да, тебе придется переделывать твою бд, устранять эту аномалию. Фильтры твои — просто пи3#@ц, какой чудак на другую букву их придумал — видимо, какой то старый матерый клипперист-dbf ник, больше 1000 записей в таблице никогда не видавший. Это надо тоже выкидывать, заменять на просто тупо поиск по маске, заданной пользователем. Ещё что может тебе помочь, это полнотекстовый поиск, причем он может даже без переделки бд. Но фильтры конечно все равно надо будет выбросить. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|

start [/forum/topic.php?fid=47&tablet=1&tid=1835027]: |
0ms |
get settings: |
9ms |
get forum list: |
16ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
53ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
46ms |
get tp. blocked users: |
1ms |
| others: | 199ms |
| total: | 341ms |

| 0 / 0 |
