Я создаю форум и ищу правильный способ создания функции поиска, которая находит пользователей по их имени или по названию их сообщений.Я придумал следующее:
SELECT users.id, users.user_name, users.user_picture
FROM users, subject1, subject2
WHERE users.id = subject1.user_id
AND users.id = subject2.user_id
AND (users.user_name LIKE '%{$keywords}%'
OR subject1.title1 LIKE '%{$keywords}%'
OR subject2.title2 LIKE '%{$keywords}%')
ORDER BY users.user_name ASC
LIMIT 10
OFFSET {$offset}
ПРЕДЕЛ и СМЕЩЕНИЕ предназначены для нумерации страниц.Мой вопрос заключается в том, будет ли выполнение поиска LIKE по нескольким таблицам значительно замедлять производительность, когда число строк достигает значительного количества?
У меня есть несколько альтернатив: во-первых, возможно, я могу переписать этот запрос, чтобы поиск LIKE выполнялся внутри подзапроса, который возвращает только индексированные user_ids.Затем я нашел бы оставшуюся информацию пользователя на основе этого.Повысит ли это производительность на много?Таким образом, я могу индексировать столбцы user_name, title1, and title2
.Однако, поскольку здесь я буду торговать точностью за скорость, насколько это повлияет на производительность?Стоит ли жертвовать такой точностью для индексации этих столбцов?
В-третьих, возможно, я могу дать пользователям 3 поля поиска на выбор, и каждое из них будет вести поиск только по одной таблице.Значительно ли это увеличит производительность?
Наконец, стоит ли мне использовать поиск FULLTEXT вместо LIKE?Каковы различия в производительности между этими двумя?Кроме того, в моих таблицах используется механизм хранения InnoDB, и я не могу использовать индекс FULLTEXT, пока не переключусь на MyISAM.Будут ли какие-либо существенные различия при переходе на MyISAM?
Разбиение на страницы - это еще одна проблема производительности, о которой я беспокоюсь, потому что для разбивки на страницы мне нужно найти общее количество результатов, возвращаемых запросом.На данный момент я в основном делаю запрос, который я только что упомянул ДВАЖДЫ, потому что в первый раз он используется только для COUNT
результатов.