@rolion

Снова про кеширование запросов к БД, как сделать?

VPS. Сайт. Серверная часть - PHP и MySQL. Есть поиск по сайту. После ввода 2-х символов идет запрос к БД и результаты сразу выгружаются под строку поиска. При вводе более 2-х символов - поиск сделал уже на стороне клиента из того, что пришло из БД, чтобы избежать лишних запросов.

С клиентской частью все гуд, все по скорости устраивает. А вот запрос к БД не устраивает, около 2-х секунд - это долго, пользователь не будет набирать сначала два символа, потом подождал, потом остальные.

Поиск идет по разным таблицам: категории, подкатегории, товары, пользователи и т.п. Попутно, идут запросы к связанным таблицам, например страны, города и т.п., чтобы потом у пользователей, в результатах удовлетворяющих строк, подставить название страны и города, например.

Запросы стандартного вида:

$resultCat = $mysqli->query("SELECT `id`,`title` FROM `cat` WHERE `title` LIKE '%".$query."%' ORDER BY `title`");


Для связанных записей:

$resultCityList = $mysqli->query("SELECT `id`,`title` FROM `city` ORDER BY `title`");// Вытаскиваем все города


Затем, все это собирается в кучу и отдается AJAX-ом клиенту.

Получается, что есть записи, которые можно кешировать на месяц, какие-то на сутки, какие-то на 15 минут, какие-то минут на 5.

Как поступить лучше, посоветуйте пожалуйста:

1) Кешировать как-то весь результат всех запросов для определенного значения $query. Т.е. если учесть что пользователь будет вводить на русском языке и это 2 символа, то думаю менее 1000 возможных результатов будет.

2) Кешировать каждый запрос по отдельности с указанием срока.

Ну и самый интересный вопрос: какое кеширование лучше здесь подойдет?

Поможет ли MySQLCache, типа

$resCity = $mysqli->query("SELECT SQL_CACHE `id`,`id_country`,`title` FROM `city` ORDER BY `title`");


Или какое кеширование будет наиболее эффективным? Вообще этого не касался...
Буду безмерно благодарен за советы и помощь!
  • Вопрос задан
  • 314 просмотров
Пригласить эксперта
Ответы на вопрос 2
FanatPHP
@FanatPHP
Чебуратор тега РНР
Запоминаем второе главное правило программирования: если работает медленно, то не надо ничего кэшировать. Надо делать так, чтобы все работало быстро без всякого кэша.
Ответ написан
Комментировать
ThunderCat
@ThunderCat Куратор тега PHP
{PHP, MySql, HTML, JS, CSS} developer
первое: WHERE `title` LIKE '%".$query."%' - уберите полный вайлдкард, LIKE '".$query."%'будет работать быстрее и использовать индекс, в отличие от первого варианта. У вас же не нужно выбирать "Калининград" по "град".

Второе - индексы подлиннее на текстовые поля, там где помещается в варчар - делайте варчар с индексом. Тогда скорее всего кеш не понадобится.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы