![]() |
|
Модераторы: LSD |
![]()
|
|
| Wowa |
|
|||
|
Эксперт Профиль Группа: Админ Сообщений: 15017 Регистрация: 14.9.2000 Где: Винград Репутация: 1 Всего: 290 |
Помогите оптимизировать запрос
Поля group1, group2, group3 - имеют тип TEXT. Нужно, чтобы были найден все записи, если: - хотя бы одно из ключевых слов присутствует в group1, но group2 и group3 - не заполнены. - хотя бы одно из ключевых слов присутствует в group1 и хотя бы одно group2, но group3 - пустой поле. - хотя бы одно из ключевых слов присутствует в group1, хотя бы одно group2 и хотя бы одно в group3 |
|||
|
||||
| Akina |
|
|||
|
Советчик ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 20581 Регистрация: 8.4.2004 Где: Зеленоград Репутация: 13 Всего: 454 |
А если ни одно из этих трех условий не выполняется, то можно и не искать все записи? во блин... Ты чего, сильно спешишь? сформулируй нормально. а лучше ДЛЯ СЕБЯ нарисуй блок-схему проверки условий - глядишь, и проще станет. толко рисуй непременно в бумаге и карандашом. Мне ЭТО часто помогало. -------------------- О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума. |
|||
|
||||
| igon |
|
||||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 327 Регистрация: 30.10.2004 Репутация: 3 Всего: 21 |
1.Т.к. для выражения типа <условие1>OR<условие2>OR<условие3>OR... <условие2> и последующие не анализируется, если <условие1> верно, предпочтительнее будет
Кроме того, может помочь и анализ частоты встречаемости ключевых слов при формировании запроса: более частое дОлжно ставить на первое место. 2. Если база поддеживает DECODE(), то можно попробовать
3. Если DECODE() не поддерживается, то
PS. Конкетенировать лучше через разделитель, скажем, пробел -------------------- Хотите поговорить об этом? |
||||||
|
|||||||
| Wowa |
|
||||||
|
Эксперт Профиль Группа: Админ Сообщений: 15017 Регистрация: 14.9.2000 Где: Винград Репутация: 1 Всего: 290 |
Если в каком-то из столбцов вообще совпадение не найдено и этот столбец не пустой, то SELECT не должен находить эту строку. Добавлено @ 11:22
Если хотя бы одно условие не выполняется, то SELECT не должен извлекать эту строку из таблицы. Добавлено @ 11:25
Кстати..., насколько сложный/ресурсоемкий запрос у нас получился? В таблице около 1000 000 записей. Три столбца, в каждом примерно по 15 слов - с которыми нужно сравнение проводить. Нужно находить все записи, не ограничивая их через LIMIT. Т.е. не частями, а сразу все.. Добавлено @ 11:25 база будет - MySQL использоваться. |
||||||
|
|||||||
| Wowa |
|
||||
|
Эксперт Профиль Группа: Админ Сообщений: 15017 Регистрация: 14.9.2000 Где: Винград Репутация: 1 Всего: 290 |
Ведь запрос:
гораздо более легкий, но выполняется на моем домашнем компе аж 40сек! А такой запрос:
6сек. Добавлено @ 11:49 Индекс правда отсутствует по столбцу post. Добавлено @ 11:55 В общем... Похоже, что без LIMIT этот запрос офигенно ресурсоемкий |
||||
|
|||||
| Wowa |
|
|||
|
Эксперт Профиль Группа: Админ Сообщений: 15017 Регистрация: 14.9.2000 Где: Винград Репутация: 1 Всего: 290 |
У меня появилась другая идея решения этой задачи. Это создать на каждую группу слов по отдельной таблице.
group1 id|slovo group2 id|slovo group3 id|slovo
|
|||
|
||||
| Akina |
|
|||
|
Советчик ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 20581 Регистрация: 8.4.2004 Где: Зеленоград Репутация: 13 Всего: 454 |
Итак - независимо ни от чего хотя бы одно ключевое слово ОБЯЗАНО присуктствовать в поле group1. Если нет - запись не отбирается. Все остальное - дополнения к этому условию. Посему кажется логичным реализовать вложенность - внутренний запрос отбирает те строки, в коих group1 содержит ключевое слово, а внешний запрос уже накладывает дополнительные условия. Кроме того "group2 и group3 - не заполнены" - это частный случай "хотя бы одно group2, но group3 - пустой поле" (как я понял). Следовательно, первый вариант отбора можно вообще вычеркнуть - все что он отберет, отберет и второй вариант, а лишние проверки обработку не ускоряют. -------------------- О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума. |
|||
|
||||
| Wowa |
|
||||
|
Эксперт Профиль Группа: Админ Сообщений: 15017 Регистрация: 14.9.2000 Где: Винград Репутация: 1 Всего: 290 |
Второй вариант(group2) отберет, но он отберет больше, чем надо. Т.к. какое-то из слов должно встречаться также в group1, ну и в group3 - если оно заполнено.
хотя бы одно из слов должно присутствовать во всех столбцах, если они не пусты. |
||||
|
|||||
![]()
|
| Правила форума "Общие вопросы по базам данных" | |
|
|
Данный форум предназначен для обсуждения вопросов о базах данных не попадающих под тематику других форумов:
Данный форум не предназначен для:
Если вы не соблюдаете эти правила, не удивляйтесь потом не найдя свою тему/сообщение.
Полезные советы: Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, LSD, Zloxa. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | СУБД, общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |