С наступающим Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы
MySQL
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.83/6: Рейтинг темы: голосов - 6, средняя оценка - 4.83
makevar
0 / 0 / 0
Регистрация: 28.06.2013
Сообщений: 7
1

Алгоритм поиска, индексы, оптимизация. поиск по сайту знакомств

28.06.2013, 18:44. Просмотров 1148. Ответов 2
Метки нет (Все метки)

Есть сайт знакомств с БД по которой осуществляется поиск собеседника по этим полям:
- возраст(tinyint) (из формы поиска почти всегда "от-до")
- город
- id города(INT)
- пол(tinyint)
- заблокирован(tinyint)

- сортировка по полю "время" последнего визита

как лучше составлять запрос для поиска, возможно лучше из нескольких, например
возраст может быть не указан, равно как и город и пол собеседника. id города может отсутствовать
статус "заблокирован" проверяется всегда

Какие индексы лучше сделать? пробовал разные. слышал, что если делать составной, то первый столбец в составном индексе может быть использован как одиночный индекс. пробую разные сочетания, но explain показывает, что используется только индекс по полю "время" которое используется для сортировки результата

Пример запроса на поиск
Код
SELECT *, `tc`.`date` AS `dt`
 FROM `table_users` AS `tu` 
LEFT JOIN `table_search` AS `ts` USING(`user_id`) 
LEFT JOIN `table_visits` AS `tc` USING(`user_id`) 
WHERE
 `sex` = '2' && `age` >= '22' && `age` <= '25' && 
 ( `sity` = 'Москва' OR `city_id` = '1' )
 && NOT `lock`
 ORDER BY `tu`.`daily` DESC
 LIMIT 0, 15
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.06.2013, 18:44
Ответы с готовыми решениями:

Индексы для поиска по двум столбцам
Гуру, помогите &quot;въехать в тему&quot;! Есть большая таблица (в планах сотни тысяч...

Поиск по сайту
Здравствуйте! Скажите пожалуйста по поводу поиска по сайту - хочу сделать...

"Поиск не дал результатов" в скрипте поиска по сайту
Здравствуйте! Пишу скрипт поиска по сайту, не могу сделать что бы выводилась...

Удаление с запроса поиска точек, пробелов, символов (метод поиска по сайту)
Добрый день, знатоки, подскажите: Если клиент вбивает в поиск номер продукта...

Реализация поиска по сайту - переход по станицам с сохранением запроса поиска
Всем известно что все запросы пользователя в данном случае хранятся в _GET...

2
sKotenok
359 / 330 / 39
Регистрация: 29.03.2011
Сообщений: 837
30.06.2013, 22:34 2
makevar, я далеко не гуру мускуля, просто моё мнение:
1) У вас OR по разным полям: (`sity` OR `city_id`) - тут индекс использован не будет. Если юзеры могут писать города "от балды" - в таком виде этот кусочек проиндексировать не получится. Как вариант - закидывать все введённые города в табличку city, добавив флаг вроде `create_by_stupid_user`. Для уменьшения мусора - можно добавить к полю автодополнение и преобразовывать в один регистр (скажем - в верхний).
2)`age` >= '22' && `age` <= '25' - мускуль может и не понять в данном случае, что индекс по `age` можно юзать, лучше поменять на
MySQL
1
`age` BETWEEN ('22', '25')
(смысл тот же, но по моим тестам - шанс попадания в индекс выше в сложных запросах).
3) Индексы при LEFT JOIN и составные - довольно непредсказуемая вещь (мускуль может использовать разные индексы для одного и того же запроса, а то и вообще не использовать).
4) Лучше не использовать NULL в полях, имеющих индекс (вроде пофиксили в последних версиях, не проверял). Для `age` или `city` можно использовать 0, для (VAR)CHAR - пустую строку. Но хотя бы возвраст лучше всё таки принудить юзеров проставить. (или добавить более "привлекательное" поле.. тэги интересов, чтоли.., главное - чтобы в запросе это поле старались использовать).
5) Всё равно не хочет - заставим (FORCE INDEX). Проверять на рабочих БД (в смысле - разогретых, а не в продакшне), не через explain, лучше мерять время в скрипте по циклу запросов. Иначе можно добиться, что в explain всё хорошо, а в рабочих FULL SCAN. (утрирую )
6) В вашем случае составные индексы - не факт, что нужны. Как я понял - юзер не обязан искать по всем полям, хуже того - может искать по любому полю. А значит запрос собирается по кусочкам или выбирается из заранее подготовленных, но. не фиксирован. Я не смог придумать составной индекс под этот случай (может я не прав)
7) Индексы по `sex` и `lock` - бесполезны скорее всего (слишком мало уникальных значений).

Ну и общий принцип при оптимизации - идти от простого к сложному: сперва выкинуть всё и добавьте условие, дающее меньше всего строк на реальной (не тестовой!) таблице - я бы начал с `age`. Сравнив время с индексом/без, добавляем следующее.
А вот с JOIN-ами - нет целостного понимания. Буду благодарен, если кто внятно обьяснит - когда и как, а главное - по какому принципу мускуль работает с индексами в данном случае - результаты в explain, замере по циклу и по обьяснению в офф. доках как-то сильно расходятся (до 2х-4х раз). Кому верить?
2
makevar
0 / 0 / 0
Регистрация: 28.06.2013
Сообщений: 7
30.06.2013, 23:07  [ТС] 3
спасибо за развёрнутый ответ. всё сказанное очень кстати. а ещё я узнал, что хотя поле `lock` и BOOLEAN(BIT) конструкция NOT `lock` не верна, вернее от неё нужно отказаться в пользу `lock`= '0' и ещё особенность, если используется только индекс `daily` то выборка затрагивает например 109 строк тогда как с индекса по `age` и `lock` уже порядка 36000 - да, всё очень расплывчато, видимо нужно потихоньку подбирать опытным путём
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.06.2013, 23:07

Нужен алгоритм поиска пути в этом лабиринте (будь то волновой алгоритм или алгоритм правой/левой руки )
#include &quot;stdafx.h&quot; #include &lt;iostream&gt; #include &lt;conio.h&gt; using...

Поиск по базе данных (служба знакомств).
Помогите, очень срочно нужно решить!!! Добавлено через 48 секунд Предметная...

Ядро для умного поиска. Алгоритм. Создать поиск для сайта
Доброго времени суток. Хочу реализовать поиск по статьям на сайте. И надеюсь...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru