Пагинация имеет решающее значение в разработке API для эффективной обработки больших наборов данных и повышения производительности. Вот шесть популярных методов пагинации:
🔹 Пагинация на основе смещения (Offset-based Pagination):
Использует параметры смещения и ограничения для определения начальной точки и количества возвращаемых записей.
- Пример: GET /orders?offset=0&limit =3
- Плюсы: Простота реализации и понимания.
- Минусы: может стать неэффективным при больших смещениях, поскольку требует сканирования и пропуска строк.
🔹 Разбиение на страницы с помощью курсора (Cursor-based Pagination):
Этот метод использует курсор (уникальный идентификатор) для обозначения позиции в наборе данных. Обычно курсор представляет собой закодированную строку, которая указывает на определенную запись.
- Пример: GET /orders?cursor=xxx
- Плюсы: более эффективен для больших наборов данных, так как не требует сканирования пропущенных записей.
- Минусы: Немного сложнее в реализации и понимании.
🔹 Постраничная пагинация (Page-based Pagination):
Этот метод определяет номер страницы и размер каждой страницы.
- Пример: GET /items?page=2&size =3
- Плюсы: Простота внедрения и использования.
- Минусы: те же проблемы с производительностью, что и при разбиении на страницы на основе смещения для больших номеров страниц.
🔹 Пагинация на основе набора ключей (Keyset-based Pagination):
Этот метод использует ключ для фильтрации набора данных, часто первичный ключ или другой индексированный столбец.
- Пример: GET /items?after_id=102&limit =3
- Плюсы: эффективно для больших наборов данных и позволяет избежать проблем с производительностью при больших смещениях.
- Минусы: требуется уникальный и индексированный ключ, может быть сложно реализовать.
🔹 Пагинация по времени (Time-based Pagination):
Этот метод использует временную метку или дату для разбиения записей на страницы.
- Пример: GET /items?start_time=xxx&end_time=yyy
- Плюсы: полезно для наборов данных, упорядоченных по времени, гарантирует, что ни одна запись не будет пропущена при добавлении новых.
- Минусы: требуется надежная и последовательная временная метка.
🔹 Гибридная пагинация (Hybrid Pagination):
Этот метод объединяет несколько методов пагинации, чтобы максимально использовать их сильные стороны.
Пример: Сочетание курсорной и временной пагинации для эффективной прокрутки упорядоченных по времени записей.
- Пример: GET /items?cursor=abc&start_time=xxx&end_time=yyy
- Плюсы: обеспечивает наилучшую производительность и гибкость для сложных наборов данных.
- Минусы: более сложная реализация и требует тщательного проектирования.
🔹 Пагинация на основе смещения (Offset-based Pagination):
Использует параметры смещения и ограничения для определения начальной точки и количества возвращаемых записей.
- Пример: GET /orders?offset=0&limit =3
- Плюсы: Простота реализации и понимания.
- Минусы: может стать неэффективным при больших смещениях, поскольку требует сканирования и пропуска строк.
🔹 Разбиение на страницы с помощью курсора (Cursor-based Pagination):
Этот метод использует курсор (уникальный идентификатор) для обозначения позиции в наборе данных. Обычно курсор представляет собой закодированную строку, которая указывает на определенную запись.
- Пример: GET /orders?cursor=xxx
- Плюсы: более эффективен для больших наборов данных, так как не требует сканирования пропущенных записей.
- Минусы: Немного сложнее в реализации и понимании.
🔹 Постраничная пагинация (Page-based Pagination):
Этот метод определяет номер страницы и размер каждой страницы.
- Пример: GET /items?page=2&size =3
- Плюсы: Простота внедрения и использования.
- Минусы: те же проблемы с производительностью, что и при разбиении на страницы на основе смещения для больших номеров страниц.
🔹 Пагинация на основе набора ключей (Keyset-based Pagination):
Этот метод использует ключ для фильтрации набора данных, часто первичный ключ или другой индексированный столбец.
- Пример: GET /items?after_id=102&limit =3
- Плюсы: эффективно для больших наборов данных и позволяет избежать проблем с производительностью при больших смещениях.
- Минусы: требуется уникальный и индексированный ключ, может быть сложно реализовать.
🔹 Пагинация по времени (Time-based Pagination):
Этот метод использует временную метку или дату для разбиения записей на страницы.
- Пример: GET /items?start_time=xxx&end_time=yyy
- Плюсы: полезно для наборов данных, упорядоченных по времени, гарантирует, что ни одна запись не будет пропущена при добавлении новых.
- Минусы: требуется надежная и последовательная временная метка.
🔹 Гибридная пагинация (Hybrid Pagination):
Этот метод объединяет несколько методов пагинации, чтобы максимально использовать их сильные стороны.
Пример: Сочетание курсорной и временной пагинации для эффективной прокрутки упорядоченных по времени записей.
- Пример: GET /items?cursor=abc&start_time=xxx&end_time=yyy
- Плюсы: обеспечивает наилучшую производительность и гибкость для сложных наборов данных.
- Минусы: более сложная реализация и требует тщательного проектирования.
👍9💯3🔥1
This media is not supported in your browser
VIEW IN TELEGRAM
Наглядно сопоставление регулярных выражений на конечных автоматах
🤪14👍5🤔2🤓2
10 лучших методов масштабирования баз данных:
1. Индексация: cоздание индексов для часто запрашиваемых столбцов для ускорения поиска данных
2. Вертикальное масштабирование: обновление сервера базы данных, использование более мощного процессора, ОЗУ или хранилища для обработки возросшей нагрузки.
3. Кэшировнаие: хранение часто используемых данных в памяти (например, Redis, Memcached), чтобы снизить нагрузку на базу данных и улучшить время отклика
4. Шардинг: распределение данных по нескольким серверам, разделение БД на более мелкие независимые фрагменты, что обеспечивает горизонтальное масштабирование и повышение производительности.
5. Репликация : Создание нескольких копий (реплик) базы данных на разных серверах, что позволяет распределять запросы на чтение между репликами и повышать доступность.
6. Оптимизация запросов: тонкая настройка SQL-запросов, исключение дорогостоящих операций и эффективное использование индексов для повышения скорости выполнения и снижения нагрузки на базу данных.
7. Пул подключений: сокращение накладных расходов на открытие/закрытие соединений с базой данных за счет повторного использования существующих соединений, что повышает производительность при интенсивном трафике.
8. Декомпозиция БД: разделение больших таблиц на более мелкие, более управляемые части (разделы), каждая из которых содержит подмножество столбцов из исходной таблицы.
9. Денормализация: хранение данных в избыточном, но структурированном формате, чтобы минимизировать сложные соединения данных и ускорить рабочие нагрузки с интенсивным чтением.
10. Представления: предварительное вычисление и сохранение результаты сложных запросов в виде отдельных таблиц, чтобы избежать дорогостоящих пересчетов, снизить нагрузку на базу данных и улучшить время отклика.
1. Индексация: cоздание индексов для часто запрашиваемых столбцов для ускорения поиска данных
2. Вертикальное масштабирование: обновление сервера базы данных, использование более мощного процессора, ОЗУ или хранилища для обработки возросшей нагрузки.
3. Кэшировнаие: хранение часто используемых данных в памяти (например, Redis, Memcached), чтобы снизить нагрузку на базу данных и улучшить время отклика
4. Шардинг: распределение данных по нескольким серверам, разделение БД на более мелкие независимые фрагменты, что обеспечивает горизонтальное масштабирование и повышение производительности.
5. Репликация : Создание нескольких копий (реплик) базы данных на разных серверах, что позволяет распределять запросы на чтение между репликами и повышать доступность.
6. Оптимизация запросов: тонкая настройка SQL-запросов, исключение дорогостоящих операций и эффективное использование индексов для повышения скорости выполнения и снижения нагрузки на базу данных.
7. Пул подключений: сокращение накладных расходов на открытие/закрытие соединений с базой данных за счет повторного использования существующих соединений, что повышает производительность при интенсивном трафике.
8. Декомпозиция БД: разделение больших таблиц на более мелкие, более управляемые части (разделы), каждая из которых содержит подмножество столбцов из исходной таблицы.
9. Денормализация: хранение данных в избыточном, но структурированном формате, чтобы минимизировать сложные соединения данных и ускорить рабочие нагрузки с интенсивным чтением.
10. Представления: предварительное вычисление и сохранение результаты сложных запросов в виде отдельных таблиц, чтобы избежать дорогостоящих пересчетов, снизить нагрузку на базу данных и улучшить время отклика.
👍10✍3❤2👨💻1
Типы индексов базы данных
[1.] Кластерный индекс (clustered index)
◾️ Физически переупорядочивает строки данных на основе ключа индекса.
◾️ По одному индексу на таблицу
◾️ Значительно ускоряет запросы по диапазону (например, поиск всех заказов между датой X и Y) и запросы по индексированным столбцам
◾️ Может замедлить изменение данных (вставку, обновление, удаление) из-за переупорядочения.
[2.] Некластеризованный индекс (non-clustered index)
◾️ Создает отдельную структуру с указателями на строки данных, отсортированные по ключу индекса.
◾️ Допускается несколько индексов для одной таблицы.
◾️ Эффективно для поиска равенства (например, поиска клиента с идентификатором 123).
◾️ Может использоваться для индексов покрытия, где все требуемые столбцы включены в индекс.
[3.] Уникальный индекс
◾️ Гарантирует, что все значения в столбце или комбинации столбцов являются уникальными.
◾️ Могут быть кластеризованными или некластеризованными.
◾️ Предотвращает дублирование значений, обеспечивая целостность данных.
◾️ Часто используется для альтернативных ключей (кроме первичного ключа), которые должны быть уникальными.
[4.] Фильтрованный индекс (Filtered Index)
◾️ Индексирует только подмножество строк на основе предиката фильтра.
◾️ Улучшает производительность для запросов, которые часто фильтруют по указанному условию.
◾️ Уменьшает размер индекса по сравнению с индексацией всей таблицы.
[5.] Полнотекстовый индекс (Full-Text Index)
◾️ Обеспечивает эффективный поиск в текстовых данных (например, документах, статьях) на основе ключевых слов и фраз.
◾️ Использует специализированные алгоритмы индексации и поиска (например, инвертированные индексы).
Поддерживает такие лингвистические функции, как стемминг и тезаурус.
[6.] Композитный индекс (Composite Index)
◾️ Индекс, созданный по нескольким столбцам.
◾️ Может быть кластеризованным или некластеризованным.
◾️ Оптимизирует запросы, которые фильтруют или сортируют по нескольким столбцам.
◾️ Порядок столбцов в определении индекса имеет решающее значение для производительности.
[7.] Индекс покрытия/покрывающий индекс (Covering Index)
◾️ Включает все столбцы, необходимые для запроса, в сам индекс, избегая необходимости доступа к базовой таблице.
◾️ Может быть некластеризованным.
◾️ Значительно ускоряет запросы, которым нужны только данные из индексированных столбцов.
[8.] Индекс с включенными столбцами (Index with Included Columns)
◾️ Аналогично покрывающему индексу, но включает только неключевые столбцы.
◾️ Некластеризованные.
◾️ Может улучшить производительность запроса, если дополнительные столбцы используются часто.
[9.] XML-индекс
◾️ Индексирует XML-данные для эффективного выполнения запросов с использованием XPath или специфичных для XML функций.
◾️ Доступно в базах данных, поддерживающих типы данных XML.
◾️ Позволяет запрашивать определенные элементы или атрибуты в XML-документах.
[10.] Частичный индекс (Partial Index)
◾️ Индексирует только подмножество строк, которые соответствуют определенному условию.
◾️ Аналогично отфильтрованным индексам, но с большей гибкостью в определении условий фильтрации.
◾️ Может улучшить производительность запросов для узкоспециализированных вариантов использования.
[11.] Индекс битовой карты (Bitmap Index)
◾️ Эффективно индексирует столбцы с низкой кардинальностью (несколько уникальных значений).
◾️ Сохраняет битовые карты, указывающие, какие строки содержат определенное значение.
[1.] Кластерный индекс (clustered index)
◾️ Физически переупорядочивает строки данных на основе ключа индекса.
◾️ По одному индексу на таблицу
◾️ Значительно ускоряет запросы по диапазону (например, поиск всех заказов между датой X и Y) и запросы по индексированным столбцам
◾️ Может замедлить изменение данных (вставку, обновление, удаление) из-за переупорядочения.
[2.] Некластеризованный индекс (non-clustered index)
◾️ Создает отдельную структуру с указателями на строки данных, отсортированные по ключу индекса.
◾️ Допускается несколько индексов для одной таблицы.
◾️ Эффективно для поиска равенства (например, поиска клиента с идентификатором 123).
◾️ Может использоваться для индексов покрытия, где все требуемые столбцы включены в индекс.
[3.] Уникальный индекс
◾️ Гарантирует, что все значения в столбце или комбинации столбцов являются уникальными.
◾️ Могут быть кластеризованными или некластеризованными.
◾️ Предотвращает дублирование значений, обеспечивая целостность данных.
◾️ Часто используется для альтернативных ключей (кроме первичного ключа), которые должны быть уникальными.
[4.] Фильтрованный индекс (Filtered Index)
◾️ Индексирует только подмножество строк на основе предиката фильтра.
◾️ Улучшает производительность для запросов, которые часто фильтруют по указанному условию.
◾️ Уменьшает размер индекса по сравнению с индексацией всей таблицы.
[5.] Полнотекстовый индекс (Full-Text Index)
◾️ Обеспечивает эффективный поиск в текстовых данных (например, документах, статьях) на основе ключевых слов и фраз.
◾️ Использует специализированные алгоритмы индексации и поиска (например, инвертированные индексы).
Поддерживает такие лингвистические функции, как стемминг и тезаурус.
[6.] Композитный индекс (Composite Index)
◾️ Индекс, созданный по нескольким столбцам.
◾️ Может быть кластеризованным или некластеризованным.
◾️ Оптимизирует запросы, которые фильтруют или сортируют по нескольким столбцам.
◾️ Порядок столбцов в определении индекса имеет решающее значение для производительности.
[7.] Индекс покрытия/покрывающий индекс (Covering Index)
◾️ Включает все столбцы, необходимые для запроса, в сам индекс, избегая необходимости доступа к базовой таблице.
◾️ Может быть некластеризованным.
◾️ Значительно ускоряет запросы, которым нужны только данные из индексированных столбцов.
[8.] Индекс с включенными столбцами (Index with Included Columns)
◾️ Аналогично покрывающему индексу, но включает только неключевые столбцы.
◾️ Некластеризованные.
◾️ Может улучшить производительность запроса, если дополнительные столбцы используются часто.
[9.] XML-индекс
◾️ Индексирует XML-данные для эффективного выполнения запросов с использованием XPath или специфичных для XML функций.
◾️ Доступно в базах данных, поддерживающих типы данных XML.
◾️ Позволяет запрашивать определенные элементы или атрибуты в XML-документах.
[10.] Частичный индекс (Partial Index)
◾️ Индексирует только подмножество строк, которые соответствуют определенному условию.
◾️ Аналогично отфильтрованным индексам, но с большей гибкостью в определении условий фильтрации.
◾️ Может улучшить производительность запросов для узкоспециализированных вариантов использования.
[11.] Индекс битовой карты (Bitmap Index)
◾️ Эффективно индексирует столбцы с низкой кардинальностью (несколько уникальных значений).
◾️ Сохраняет битовые карты, указывающие, какие строки содержат определенное значение.
👍10❤2🔥1🤯1
Microsoft тестирует возможность установки Windows 11 в разделы диска с альтернативной файловой системой ReFS.
При чистой установке Windows с помощью файла ISO или прямой загрузке с помощью USB пользователь на этапе установки может выбрать в том числе тип файловой системы.
Возможность выбора типа файловой системы при разметке накопителя обнаружена в тестовой сборке с номером 27823 (Canary).
ReFS (Resilient File System) – файловая система, разрабатываемая Microsoft в качестве альтернативы NTFS. ReFS была представлена в 2012 г. и должна была стать альтернативой NTFS, переняв у нее все лучшее и отсеяв сложное. Например, в отличие от NTFS, ReFS не поддерживает короткие имена файлов, шифрование и сжатие на уровне файлов, а также жесткие ссылки и квоты. В то же время ReFS отличается более высокой надежностью, при этом в значительной степени сохраняет совместимость с возможностями NTFS
https://www.windowslatest.com/2025/03/27/windows-11-setup-will-let-you-choose-between-ntfs-and-refs-when-clean-installing/
При чистой установке Windows с помощью файла ISO или прямой загрузке с помощью USB пользователь на этапе установки может выбрать в том числе тип файловой системы.
Возможность выбора типа файловой системы при разметке накопителя обнаружена в тестовой сборке с номером 27823 (Canary).
ReFS (Resilient File System) – файловая система, разрабатываемая Microsoft в качестве альтернативы NTFS. ReFS была представлена в 2012 г. и должна была стать альтернативой NTFS, переняв у нее все лучшее и отсеяв сложное. Например, в отличие от NTFS, ReFS не поддерживает короткие имена файлов, шифрование и сжатие на уровне файлов, а также жесткие ссылки и квоты. В то же время ReFS отличается более высокой надежностью, при этом в значительной степени сохраняет совместимость с возможностями NTFS
https://www.windowslatest.com/2025/03/27/windows-11-setup-will-let-you-choose-between-ntfs-and-refs-when-clean-installing/
🤔6🙏3👏2👍1
Основные аспекты кэширования, которые следует учитывать:
Сценарии использования:
- Развертывание решения в памяти
- При работе с высоконагруженными системами
- Когда данные не обновляются часто
Техники кэширования:
- Cache aside
- Write-through
- Read-through
- Write-around
- Write-back
Алгоритмы удаления из кэша:
- Least Recently Used (LRU)
- Least Frequently Used (LFU)
- First-in First-out (FIFO)
- Random Replacement (RR)
Ключевые метрики:
- Коэффициент попадания в кэш
- Задержка
- Пропускная способность
- Коэффициент аннулирования (Invalidation Rate)
- Использование памяти
- использование ЦП
- Использование сети
Другие вопросы:
- Предварительная загрузка наиболее запрашиваемых данных при холодном пуске
- Время жизни (TTL)
Сценарии использования:
- Развертывание решения в памяти
- При работе с высоконагруженными системами
- Когда данные не обновляются часто
Техники кэширования:
- Cache aside
- Write-through
- Read-through
- Write-around
- Write-back
Алгоритмы удаления из кэша:
- Least Recently Used (LRU)
- Least Frequently Used (LFU)
- First-in First-out (FIFO)
- Random Replacement (RR)
Ключевые метрики:
- Коэффициент попадания в кэш
- Задержка
- Пропускная способность
- Коэффициент аннулирования (Invalidation Rate)
- Использование памяти
- использование ЦП
- Использование сети
Другие вопросы:
- Предварительная загрузка наиболее запрашиваемых данных при холодном пуске
- Время жизни (TTL)
👍6
This media is not supported in your browser
VIEW IN TELEGRAM
Наглядно алгоритмы балансировки нагрузки
👍7❤3🔥2
Типы ключей в базах данных
Primary key (Первичный ключ)
Уникальный идентификатор для каждой записи в таблице. Он не может быть равен NULL и должен быть уникальным для всей таблицы
Foreign key (Внешний ключ)
Поле в таблице, которое создает ссылочную связь между двумя таблицами. Оно используется для установления отношения между таблицами
Composite key (Составной ключ)
Комбинация двух или более столбцов, используемых в качестве первичного ключа, когда ни один отдельный столбец не достаточен для однозначной идентификации записи
Alternate key (Альтернативный ключ)
Уникальный идентификатор для записи, который не является первичным ключом. Его можно использовать в качестве вторичного ключа при поиске данных в таблице
Candidate key (Ключ-кандидат)
Уникальный идентификатор для записи в таблице, которая потенциально может использоваться в качестве первичного ключа
Surrogate key
Уникальный идентификатор для записи в таблице, обычно присваивается базой данных, а не самим пользователем
#database #sql
Primary key (Первичный ключ)
Уникальный идентификатор для каждой записи в таблице. Он не может быть равен NULL и должен быть уникальным для всей таблицы
Foreign key (Внешний ключ)
Поле в таблице, которое создает ссылочную связь между двумя таблицами. Оно используется для установления отношения между таблицами
Composite key (Составной ключ)
Комбинация двух или более столбцов, используемых в качестве первичного ключа, когда ни один отдельный столбец не достаточен для однозначной идентификации записи
Alternate key (Альтернативный ключ)
Уникальный идентификатор для записи, который не является первичным ключом. Его можно использовать в качестве вторичного ключа при поиске данных в таблице
Candidate key (Ключ-кандидат)
Уникальный идентификатор для записи в таблице, которая потенциально может использоваться в качестве первичного ключа
Surrogate key
Уникальный идентификатор для записи в таблице, обычно присваивается базой данных, а не самим пользователем
#database #sql
👍8🔥4🍾2
Media is too big
VIEW IN TELEGRAM
Стереотипы о программистах на различных языках согласно AI
😁30💩20🥰1👏1🤔1😢1
Схематически компиляция кода на C++ в exe-файл с помощью компилятора Microsoft Visual C++
#cpp
#cpp
👍11🍓6🔥3
Секционирование базы данных (partitioning) и Шардинг
Секционирование базы данных применяется для управляемости, а шардинг для масштабируемости.
Секционирование базы данных
Предполагает разделение данных на сегменты (разделы) для более удобного управления или группировки связанных данных.
Часто используется в рамках одной системы и прозрачно для приложения.
Шардинг
Предполагает разделение данных по нескольким базам данных или серверам для распределения нагрузки и горизонтального масштабирования.
Каждый сегмент работает независимо, и часто приложению требуется логика для направления запросов на нужный сегмент, если только система хранения данных не поддерживает перенаправление
Секционирование базы данных применяется для управляемости, а шардинг для масштабируемости.
Секционирование базы данных
Предполагает разделение данных на сегменты (разделы) для более удобного управления или группировки связанных данных.
Часто используется в рамках одной системы и прозрачно для приложения.
Шардинг
Предполагает разделение данных по нескольким базам данных или серверам для распределения нагрузки и горизонтального масштабирования.
Каждый сегмент работает независимо, и часто приложению требуется логика для направления запросов на нужный сегмент, если только система хранения данных не поддерживает перенаправление
👍8❤1🔥1