Очень медленно выполняется простейший SELECT запрос

172
12 апреля 2019, 10:50

Есть простая таблица с двумя полями - 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 записей.

Answer 1

Предположу, что у вас отсутствует индекс по полю request_uri.

Создайте индекс (судя по вашему описанию он может быть уникальным) в вашей БД:

CREATE UNIQUE INDEX ix_tickets_bottom_text ON tickets_bottom_text(request_uri);

PS поиск по уникальному индексу обычно быстрее чем по неуникальному.

PPS даже несмотря на то, что у вас всего 10 записей в таблице - они занимают несколько страниц (хранится текст в среднем 2000 символов), если поле request_uri занимает значительно меньше памяти, то возможно весь индекс поместится в меньшее количество страниц. В любом случае при доступе при помощи уникального индекса понадобится чтение одной дополнительной страницы данных (если вернуть надо поле(я), не содержащееся в самом индексе).

Answer 2

Поиск по строковым полям осуществляется медленнее чем поиск по полям типа int. Попробуйте указать поле pathname как индекс

READ ALSO
Не перетираемые записи в memcached

Не перетираемые записи в memcached

Судя по документации Memcached в PHP, объекты записываются в память и хранятся там до тех пор, пока:

146
Curl proxy с переменными из файла PHP

Curl proxy с переменными из файла PHP

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

186
php+mvc как можно передать title из представления в шаблон?

php+mvc как можно передать title из представления в шаблон?

Пытаюсь разбираться с PHP и в частности с моделью MVCПодскажите, пожалуйста: Разбирая базовый набор фреймворка yii2, нашел, что в представлении...

134