Сначала фронтенд:
1. Запрос обычно делается не сразу после нажатия кнопки а спустя некий таймаут, давая возможность пользователю ввести часть слова целиком, а после того как ввод уже остановился(например спустя 2сек после последнего события keyup) делается запрос к базе с той строкой которая получилась в итоге. (Иначе просто получится что пользователь введет быстро например слово "телевизор" и если без таймаута на сервер уйдёт 8 ненужных запросов вместо одного)
2. После обработки результат и запрос обычно кешируется (на случай если пользователь сотрёт все и заново напишет "телевизор" - запроса к базе не будет и он получит результат из кеша, если же сотрет и напишет "тел" - будет опять запрос к базе да) Пример кеширования на jqueryui:
https://jqueryui.com/autocomplete/#remote-with-cache
Но это все ограничивается в фронтенде и по сути только для удобства пользователя.
А на серверной стороне да - запрос выполняется при каждом обращении к скрипту, но и там может быть настроено кеширование и обходится без запроса к базе.