Есть простая таблица с двумя полями - text и pathname. В первом поле хранится текст (в среднем 2000 символов), а во втором - URL запрошенной страницы. При открытии страницы выполняется запрос к базе. Если найдена запись с нужным pathname, то функция возвращает текст этой записи. Почему-то этот запрос выполняется непозволительно долго на фоне остальных - 200 миллисекунд.
function getBottomPageText($request_uri) {
$postgre = new Postgre();
$connect = $postgre->connect();
$query = "SELECT text FROM tickets_bottom_text WHERE pathname = '{$request_uri}'";
$result = pg_query($query) or die('Query failed: ' . pg_last_error());
pg_close($connect);
if(pg_num_rows($result) > 0) {
$row = pg_fetch_assoc($result);
return array(
'text' => $row['text']
);
} else {
return array(
'text' => null
);
}
}
Почему так сильно проседает производительность при простейшей выборке текста? В таблице всего 10 записей.
Предположу, что у вас отсутствует индекс по полю request_uri.
Создайте индекс (судя по вашему описанию он может быть уникальным) в вашей БД:
CREATE UNIQUE INDEX ix_tickets_bottom_text ON tickets_bottom_text(request_uri);
PS поиск по уникальному индексу обычно быстрее чем по неуникальному.
PPS даже несмотря на то, что у вас всего 10 записей в таблице - они занимают несколько страниц (хранится текст в среднем 2000 символов), если поле request_uri занимает значительно меньше памяти, то возможно весь индекс поместится в меньшее количество страниц. В любом случае при доступе при помощи уникального индекса понадобится чтение одной дополнительной страницы данных (если вернуть надо поле(я), не содержащееся в самом индексе).
Поиск по строковым полям осуществляется медленнее чем поиск по полям типа int. Попробуйте указать поле pathname как индекс
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости