Индексы Postgres не используются - PullRequest
0 голосов
/ 23 марта 2019

Новичок в Postgres и не очень знаком с тем, как работают RDBMS в целом Я читал, что в некоторых случаях добавление индекса в таблицу ускоряет выполнение запросов к базам данных. Я попробовал это с таблицей и сделал это (Postgres v11.2):

CREATE TABLE testtable(
    idString text,
    comment text
);


INSERT INTO 
    testtable(idString, comment)
VALUES
    ('1:2', 'some text'),
    ('12:2', 'blah'),
    ('2:2', 'other text'),
    ('1:3', 'blah'),
    ('33:2', 'blah');


CREATE INDEX myindex ON testtable(idString asc);

В руководстве, которое я читал, говорилось, что без индекса база данных обычно выполняет «последовательное сканирование» всех записей до тех пор, пока не найден запрос, но с индексом она выполняет «сканирование индекса». Руководство говорит, чтобы увидеть план запроса, используя «EXPLAIN», поэтому я делаю:

EXPLAIN SELECT * FROM testtable WHERE myid = '1:3';

Вывод, однако, по-прежнему выглядит как последовательное сканирование:

                        QUERY PLAN
----------------------------------------------------------
 Seq Scan on testtable  (cost=0.00..1.07 rows=1 width=64)
   Filter: (myid = '1:3'::text)
(2 rows)

Я проверил с помощью pgAdmin и вижу, что myindex существует, но я не уверен, почему база данных не использует его? Есть что-то еще, что я пропускаю / не сделал?

1 Ответ

3 голосов
/ 23 марта 2019

Базы данных учитывают множество факторов при принятии решения об использовании индекса.

Ваш запрос:

SELECT *
FROM testtable
WHERE myid = '1:3';

Существует два основных подхода:

Первым является сканирование данных и применение предложения WHERE к каждой строке.

Второй - найти значение в индексе и затем извлечь остальные данные.

Что дешевле? В вашем случае first дешевле. Зачем? Только одна страница должна быть перемещена из третичного хранилища в память. Сканирование страницы - после выполнения всей работы по ее загрузке - довольно дешево.

Использование индекса требует загрузки двух страниц, одной для индекса и одной для данных.

Хотя оптимизация базы данных сложна, это простой пример, чтобы дать вам представление о различных методах, используемых при оптимизации и компромиссах.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...