Форум программистов, компьютерный форум, киберфорум
PHP: базы данных
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
 Аватар для Lion_astana
16 / 16 / 8
Регистрация: 15.03.2010
Сообщений: 321

Снова про кеширование запросов к БД

23.09.2019, 19:50. Показов 986. Ответов 1
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет.

Работаю с PHP и MySQL уже давно, но, к моему стыду, про кеширование только читал, надобности никуда внедрять не было.

Теперь настал мой час ))))

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

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

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

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

PHP
1
$resultCat = $mysqli->query("SELECT `id`,`title` FROM `cat` WHERE `title` LIKE '%".$query."%' ORDER BY `title`");
Для связанных записей:

PHP
1
2
3
4
5
$totalCityArr = array();// Общий массив всех городов
$resultCityList = $mysqli->query("SELECT `id`,`title` FROM `city` ORDER BY `title`");// Вытаскиваем все города
while($myrowCityList = $resultCityList->fetch_assoc()){
    $totalCityArr[$myrowCityList['id']] = $myrowCityList['title'];
}
Затем, все это собирается в кучу и отдается AJAX-ом клиенту.

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

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

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

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

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

Поможет ли MySQLCache, типа
PHP
1
2
3
4
5
$cityBaseArr = array();// Все города из базы
$resCity = $mysqli->query("SELECT SQL_CACHE `id`,`id_country`,`title` FROM `city` ORDER BY `title`");                                
while($myrCity = $resCity->fetch_assoc()){
    $cityBaseArr[$myrCity['id']] = array("country"=>$myrCity['id_country'],"title"=>$myrCity['title']);
}
Или какое кеширование будет наиболее эффективным? Вообще этого не касался...
Буду безмерно благодарен за советы и помощь!
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
23.09.2019, 19:50
Ответы с готовыми решениями:

Кеширование запросов к БД
Кэширование можно организовать средствами PHP и самой БД.Пока хочу расмотреть сторону PHP. Какие есть варианты кэширования запросов? ...

И снова про PopupMenu (было про длину, теперь про ширину)
Добавляем в пустое PopupMenu несколько пунктов динамически (шириной, например, до 50 символов). Отображаем его – всё нормально. Затем...

Кеширование данных запросов в приложении
Какие вы знаете инструменты для работы с сетью (http) которые позволяют кешировать запросы, чтобы можно было получить данные даже в offline...

1
29 / 26 / 18
Регистрация: 02.04.2015
Сообщений: 316
28.09.2019, 00:48
Сразу оговорюсь: не факт, что дам правильные советы! )
Дальше по порядку:
- mysql от oracle, а так же форки от mariadb и percona, в современных версиях либо полностью ушли от кеширования результатов запросов, либо объявили эту опцию устаревшей. Если сейчас заморочиться, найти базу, которая пока не выкинула query_cache_* из доступных опций, то очень скоро можно столкнуться с необходимостью "всё переписывать".
- Можно обратить внимание на полнотекстовый поиск в mysql, однако они же, в соседней статье, рекомендуют не делать этого средствами mysql;
- Если вот это:
Цитата Сообщение от Lion_astana Посмотреть сообщение
Кешировать как-то весь результат всех запросов для определенного значения $query. Т.е. если учесть что пользователь будет вводить на русском языке и это 2 символа, то думаю менее 1000 возможных результатов будет.
Действительно и "вся задача", то что мешает создать таблицу, в которую занести ключ/значения и искать по ней?
- В php есть memcache и ему подобные. Если создание таблицы невозможно (например нет админ.прав), то можно строить свой кеш прямо в php с ключам и временем жизни (актуально, если условие из предыдущего пункта выполняется и "менее 1к возможных вариантов" - реальность).
- В последнее время, всякий раз, когда необходимо искать вхождения текста, я ухожу от mysql в сторону NoSQL баз (лично я привык пользоваться Elasticsearch'ем, потому как он "простой в доску" в использовании). Слухи о прожорливости ресурсов считаю не состоятельными, так как та же mysql, для обеспечения сопоставимой скорости выполнения поиска в тексте, потребует и сожрёт не меньше, а скорее больше.

Всё вышеперечисленное сугубо субъективное видение ситуации "около кеширования" участника сего форума, часто самого спрашивающего в разделах "для начинающих".
Удачи))
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
28.09.2019, 00:48
Помогаю со студенческими работами здесь

Prototype Как отменить кеширование get-запросов?
даже не ожидал увидеть на форуме отдельный раздел... Есть проблема с этим прототайпом и get-запросами, им генерируемыми. Суть...

Снова про
У меня сайт на Джумле. Движок хороший, но в плане оптимизации... Скажем так, спорный. Все заголовки она выводит просто текстами, а...

Снова про TabOrder
На форме есть GroupBox'ы и в них несколько Edit'ов, ComboBox'ы...ну и т.д. TabOrder'ы каждого компонента упорядочены. При создании формы...

и снова про e-mail
Добрый день. Вот какая проблемка: отправляю письмо с прикрепленным файлом. И все проходит нормально ;) Затем меняю адрес и содержание...

Снова про ACWZMAIN
Создал новую базу без всяких мастеров. Первая форма в базе. И первая кнопка на ней. Написал две строчки. Смотрю, а он уже в проектах......


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

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Новые блоги и статьи
Автозаполнение реквизита при выборе элемента справочника
Maks 27.03.2026
Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. При выборе "Спецтехники" (Тип Справочник. Спецтехника), заполняется. . .
Сумматор с применением элементов трёх состояний.
Hrethgir 26.03.2026
Тут. https:/ / fips. ru/ EGD/ ab3c85c8-836d-4866-871b-c2f0c5d77fbc Первый документ красиво выглядит, но без схемы. Это конечно не даёт никаких плюсов автору, но тем не менее. . . всё может быть. . .
Автозаполнение реквизитов при создании документа
Maks 26.03.2026
Программный код из решения ниже размещается в модуле объекта документа, в процедуре "ПриСозданииНаСервере". Алгоритм проверки заполнения реализован для исключения перезаписи значения реквизита,. . .
Команды формы и диалоговое окно
Maks 26.03.2026
1. Команда формы "ЗаполнитьЗапчасти". Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. В качестве источника данных. . .
Кому нужен AOT?
DevAlt 26.03.2026
Решил сделать простой ланчер Написал заготовку: dotnet new console --aot -o UrlHandler var items = args. Split(":"); var tag = items; var id = items; var executable = args;. . .
Отправка уведомления на почту при изменении наименования справочника
Maks 24.03.2026
Программная отправка письма электронной почты на примере изменения наименования типового справочника "Склады" в конфигурации БП3. Перед реализацией необходимо выполнить настройку системной учетной. . .
модель ЗдравоСохранения 5. Меньше увольнений- больше дохода!
anaschu 24.03.2026
Теперь система здравосохранения уменьшает количество увольнений. 9TO2GP2bpX4 a42b81fb172ffc12ca589c7898261ccb/ https:/ / rutube. ru/ video/ a42b81fb172ffc12ca589c7898261ccb/ Слева синяя линия -. . .
Midnight Chicago Blues
kumehtar 24.03.2026
Такой Midnight Chicago Blues, знаешь?. . Когда вечерние улицы становятся ночными, а ты не можешь уснуть. Ты идёшь в любимый старый бар, и бармен наливает тебе виски. Ты смотришь на пролетающие. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru