RSS Telegram YouTube Apple Яндекс Spotify Google Amazon Почта

1. pg_basebackup, gzip vs zstd, DB indexes, Golang survey

27.05.2023

Скачать

К списку выпусков

PostgreSQL internals

Меня продолжает удивлять PostgreSQL. Невероятная СУБД с широким спектром возможностей.

Помимо документации, считаю лучшей книгой по углубленному изучению и пониманию этого продукта "PostgreSQL изнутри" Егора Рогова. Книга бесплатная для скачивания и недавно была выпущена её обновленная версия для 15 - последней стабильной - версии PostgreSQL.

Тут стоит сделать небольшую рекламу их YouTube-канала. Вы без труда можете найти его по имени "Postgres Professionals". На канале есть ряд плейлистов для углубленного изучения этой СУДБ. Авторы материалов - это активные контрибьюторы PostgreSQL. Скорее всего доклады Олега Бартунова вы слышали не раз.

Сейчас читаю в этой книге про внутреннюю организацию B-Tree индексов и их реализацию в PostgreSQL. Напомню, что PostgreSQL был создан как расширяемый продукт, поэтому вы можете достаточно просто создать свой тип, определить как для этого типа работают операторы и создать класс таких операторов, которого будет достаточно, чтобы работала сортировка в B-Tree индексе:

    CREATE TYPE capacity AS (amount integer, unit capacity_units);
    CREATE OPERATOR #># (LEFTARG = capacity, RIGHTARG = capacity, FUNCTION = capacity_gt);
    CREATE OPERATOR CLASS capacity_ops
    DEFAULT FOR TYPE capacity
    USING btree AS
    OPERATOR 1 #<#,
    OPERATOR 2 #<=#,
    OPERATOR 3 #=#,
    OPERATOR 4 #>=#,
    OPERATOR 5 #>#,
    FUNCTION 1 capacity_cmp(capacity,capacity);
    CREATE INDEX ON test(cap);

Из полезного, на чем стоит отдельно заострить внимание - это эффективное использование составных индексов (в официальной документации Multicolumn Index). Составной индекс - индекс составленный из конкатенации нескольких колонок таблицы. Эффективное использование индекса возможно с WHERE по всем колонками такого индекса, либо по первой, либо по первой и второй, либо по первой, второй и третьей и т.д. Тут очень важен порядок! Т.е. если индекс составлен из колонок company_id и contact_id, то попытка выборки только по contact_id (вторая колонка в индексе) вынудит базу данных игнорировать вторую колонку.

Почему? Потому что сортировка в индексе выполнена по конкатенации company_id и contact_id. Если бы contact_id был объявлен на первом месте при создании индекса, то выборка просиходила бы по B-Tree индексу.

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

Понимая структуры данных, используемые в B-Tree индексе можно его эффективнее использовать. Например, если вы часто выполняете поиск по вхождению подстроки и нужно выполнить поиск по соответсвию окончания, то лучше отзеркалировать строку, чтобы выполнять поиск вхождения по началу с помощью оператора LIKE.

Результаты опроса Go комьюнити

Ссылка на результаты: https://go.dev/blog/survey2023-q1-results

Из интересного:

К списку выпусков