This repository has been archived by the owner on May 26, 2022. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 71
/
postgresql_partitioning.tex
30 lines (20 loc) · 3.75 KB
/
postgresql_partitioning.tex
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
\chapter{Партиционирование}
\label{sec:partitioning}
\begin{epigraphs}
\qitem{Решая какую-либо проблему, всегда полезно заранее знать правильный ответ.
При условии, конечно, что вы уверены в наличии самой проблемы}{Народная мудрость}
\end{epigraphs}
\section{Введение}
Партиционирование (partitioning, секционирование)~--- это разбиение больших структур баз данных (таблицы, индексы) на меньшие кусочки. Звучит сложно, но на практике все просто.
Скорее всего у Вас есть несколько огромных таблиц (обычно всю нагрузку обеспечивают всего несколько таблиц СУБД из всех имеющихся). Причем чтение в большинстве случаев приходится только на самую последнюю их часть (т.~е. активно читаются те данные, которые недавно появились). Примером тому может служить блог~--- на первую страницу (это последние 5\dots10 постов) приходится 40\dots50\% всей нагрузки, или новостной портал (суть одна и та же), или системы личных сообщений, впрочем понятно. Партиционирование таблицы позволяет базе данных делать интеллектуальную выборку~--- сначала СУБД уточнит, какой партиции соответствует Ваш запрос (если это реально) и только потом сделает этот запрос, применительно к нужной партиции (или нескольким партициям). Таким образом, в рассмотренном случае, Вы распределите нагрузку на таблицу по ее партициям. Следовательно выборка типа \lstinline!SELECT * FROM articles ORDER BY id DESC LIMIT 10! будет выполняться только над последней партицией, которая значительно меньше всей таблицы.
Итак, партиционирование дает ряд преимуществ:
\begin{itemize}
\item На определенные виды запросов (которые, в свою очередь, создают основную нагрузку на СУБД) мы можем улучшить производительность;
\item Массовое удаление может быть произведено путем удаления одной или нескольких партиций (\lstinline!DROP TABLE! гораздо быстрее, чем массовый \lstinline!DELETE!);
\item Редко используемые данные могут быть перенесены в другое хранилище;
\end{itemize}
\input{partitioning/introduction}
\input{partitioning/pg_partman}
\input{partitioning/pgslice}
\section{Заключение}
Партиционирование~--- одна из самых простых и менее безболезненных методов уменьшения нагрузки на СУБД. Именно на этот вариант стоит посмотреть сперва, и если он не подходит по каким либо причинам~--- переходить к более сложным.