๐ PostgreSQL ๅคง่ฆๆจกใใผใฟๅฎ่ฃ :50ไธไปถใใผใฟ็ๆ・ใใฃใผใซใๅ ฅๅ・ใใใฏใขใใ・ๅพฉๅ ・ๆง่ฝใใณใใใผใฏๅฎๅ จใฌใคใ
ๆฌ่จไบใงใฏ、PostgreSQL 17 ใไฝฟ็จใ、ๅคง่ฆๆจกใใผใฟ(50ไธไปถ)ใ็ๆใ、ใใฃใผใซใใ่ชๅๅ ฅๅใ、ใใใฏใขใใใใใณๅพฉๅ 、ใใผใฟๆดๅๆงใฎๆค่จผ、pgbench ใ็จใใๆง่ฝใใณใใใผใฏใพใงใไธ่ฒซใใฆ่งฃ่ชฌใใพใ。 ๆง่ฝๆค่จผ、่ฒ ่ทใในใ、ใฏใจใชๆ้ฉๅ、็ฝๅฎณๅพฉๆงๆผ็ฟใซๆ้ฉใชๅฎ่ทต็ๆ้ ใงใ。
1️⃣ ใทในใใ ็ฐๅข
- OS:CentOS Stream 10
- Database:PostgreSQL 17
- ็ฎก็ใใผใซ:Adminer(PHP Web UI)
- ใในใ็ฐๅข:4 vCPU / 8GB RAM / NVMe SSD
๐ฆ PostgreSQL 17 ใฎใคใณในใใผใซ
sudo dnf install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-10-x86_64/pgdg-redhat-repo-latest.noarch.rpm
sudo dnf -qy module disable postgresql
sudo dnf install -y postgresql17 postgresql17-server
sudo /usr/pgsql-17/bin/postgresql-17-setup initdb
sudo systemctl enable --now postgresql-17
๐ ใชใขใผใๆฅ็ถใฎ่จฑๅฏ
sudo sed -i "s/^#listen_addresses = .*/listen_addresses = '*'/" /var/lib/pgsql/17/data/postgresql.conf
sudo sed -i '$a host all all 192.168.1.0/24 md5' /var/lib/pgsql/17/data/pg_hba.conf
sudo systemctl restart postgresql-17
2️⃣ Adminer ใฎใคใณในใใผใซ
sudo dnf install -y httpd php php-pgsql
sudo systemctl enable --now httpd
sudo mkdir -p /var/www/html/adminer
sudo wget -O /var/www/html/adminer/index.php https://www.adminer.org/latest.php
sudo chown -R apache:apache /var/www/html/adminer
sudo chmod -R 755 /var/www/html/adminer
3️⃣ 50ไธไปถใใผใฟ็จใใผใใซไฝๆ
CREATE TABLE test_table_500k (
id SERIAL PRIMARY KEY,
info TEXT,
name_zh TEXT,
phone TEXT,
email TEXT,
address TEXT,
date_value DATE,
randstr TEXT
);
4️⃣ 50ไธไปถใฎใใผใฟๆฟๅ ฅ
sudo -u postgres psql postgres -c \
"INSERT INTO test_table_500k (info)
SELECT 'batch500k-' || generate_series(1,500000);"
✔ ไปถๆฐ็ขบ่ช
SELECT COUNT(*) FROM test_table_500k;
5️⃣ ใใฃใผใซใ่ชๅๅ ฅๅ(ๅๅ / ้ป่ฉฑ / Email / ไฝๆ / ๆฅไป / ใฉใณใใ ๆๅญๅ)
sudo -u postgres psql postgres -c "
UPDATE test_table_500k
SET
name_zh =
(ARRAY['ๅฑฑ็ฐ','ไฝ่ค','้ดๆจ','็ฐไธญ','้ซๆฉ','ไผ่ค','ๆธก่พบ','ไธญๆ','ๅฐๆ','ๅ ่ค',
'ๅ็ฐ','ๅฑฑๆฌ','ไบไธ','ๆจๆ','ๆธ
ๆฐด','ๆพๆฌ','ๆ','ๆ่ค','ๅฑฑๅฃ','็ณๅท'])[floor(random()*20)+1] ||
(ARRAY['ๅคช้','่ฑๅญ','็พๅฒ','ไธ้','ๅคง่ผ','ๅชๅญ','ๅฅๅคช','็ฟๅคช','็ต่กฃ','ๆ',
'่ต','้ฝ่','ๆ ๆ','ใใใ','็ต่','่ฝไพ','้ฝ้ฆ','้ขฏๅคช','ๆฅ','ๅฟ็ต'])[floor(random()*20)+1],
phone = '080' || lpad((floor(random()*10000000))::text, 7, '0'),
email = lower(substr(md5(random()::text), 1, 8)) || '@example.com',
address =
(ARRAY['ๆฑไบฌ้ฝ','็ฅๅฅๅท็','ๅคง้ชๅบ','ๅผ็็','ๅ่็','ๅๆตท้','็ฆๅฒก็','ๅ
ตๅบซ็','ไบฌ้ฝๅบ'])[floor(random()*9)+1]
|| (floor(random()*200)+1)::text || 'ไธ็ฎ',
date_value = CURRENT_DATE - (floor(random()*730))::int,
randstr = substr(md5(random()::text), 1, 16);
"
6️⃣ Adminer ใงใใผใฟ็ขบ่ช
Adminer → postgres → test_table_500k ใ้ใใฆๅ ๅฎนใ็ขบ่ชใใพใ。
7️⃣ PostgreSQL ใใใฏใขใใ(pg_dump)
๐ ๅไธใใผใฟใใผในใฎใใใฏใขใใ
sudo -u postgres /usr/pgsql-17/bin/pg_dump postgres > /root/postgres.sql
๐ฆ ๅ จใใผใฟใใผในใฎใใใฏใขใใ
sudo -u postgres /usr/pgsql-17/bin/pg_dumpall > /root/all_databases.sql
8️⃣ ใใใฏใขใใใตใคใบ(SQL / gzip / tar.gz)
| ๅฝขๅผ | ใณใใณใ | ใตใคใบ |
|---|---|---|
| SQL ใใกใคใซ | pg_dump postgres | ็ด 92 MB |
| gzip ๅง็ธฎ | gzip postgres.sql | ็ด 11 MB |
| tar.gz | tar -czvf | ็ด 10〜12 MB |
9️⃣ SQL ใใณใๅ ๅฎนใฎไธ้จ
COPY public.test_table_500k (...)
1 batch500k-1 ๅฑฑ็ฐๅคช้ 0801234567 f3b93caa21@example.com ...
2 batch500k-2 ไฝ่ค่ฑๅญ 0809988776 c1ec92d889@example.com ...
๐ ๅพฉๅ ็จใใผใฟใใผในไฝๆ:testdb2
sudo -u postgres psql -c "CREATE DATABASE testdb2;"
1️⃣1️⃣ ใใผใฟๅพฉๅ
sudo -u postgres psql testdb2 < /root/postgres.sql
1️⃣2️⃣ ๆดๅๆงใใงใใฏ(checksum)
✔ ๅ ใใผใฟ
SELECT md5(string_agg(randstr, '' ORDER BY id)) FROM test_table_500k;
✔ ๅพฉๅ ๅพใใผใฟ
SELECT md5(string_agg(randstr, '' ORDER BY id)) FROM test_table_500k;
ไธ่ดใใใฐๆดๅๆงใฏๅฎๅ จใซไฟ่จผใใใพใ。
1️⃣3️⃣ PostgreSQL pgbench ใใณใใใผใฏ(TPS / ใฌใคใใณใท)
๐ pgbench ใฎใคใณในใใผใซ
sudo dnf install -y postgresql17-contrib
๐ ๅๆๅ(scale=50 → ็ด500ไธ่ก)
sudo -u postgres pgbench -i -s 50 postgres
๐ ใใณใใใผใฏๅฎ่ก(20 ใฏใฉใคใขใณใ / 4 ในใฌใใ / 30็ง)
sudo -u postgres pgbench -c 20 -j 4 -T 30 postgres
๐ ๅบๅไพ
latency average = 3.85 ms
tps = 5188.41 (including connections)
tps = 5201.92 (excluding connections)
1️⃣4️⃣ ใใใฏใขใใ vs ๅพฉๅ ใฎๆ้ๆฏ่ผ(50ไธไปถ)
| ไฝๆฅญ | ใณใใณใ | ๆ้ | ่ชฌๆ |
|---|---|---|---|
| pg_dump | pg_dump postgres | ็ด 9.2็ง | ใใญในใใใผในๅบๅ |
| gzip ๅง็ธฎ | gzip postgres.sql | ็ด 3.4็ง | ๅฎน้็ด11MBใซ็ธฎๅฐ |
| tar.gz | tar -czvf | ็ด 3.8็ง | ่คๆฐใใกใคใซใพใจใๅฏ่ฝ |
| psql ๅพฉๅ | psql testdb2 < postgres.sql | ็ด 15.6็ง | COPY ๆนๅผใง้ซ้ |
| checksum ๆฏ่ผ | string_agg + md5 | ็ด 2.1็ง | ๅฎๅ จๆดๅๆงใใงใใฏ |
็ฐๅขใซใใใใพใใ、ใใใฏใขใใ〜ๅพฉๅ 〜ๆดๅๆงๆค่จผใพใงๅ่จ 30〜35็งใงๅฎไบใใพใ。
๐ ใพใจใ
ๆฌ่จไบใงใฏ、PostgreSQL ใ็จใใฆ 50ไธไปถใฎใใผใฟ็ๆ、ใใฃใผใซใ่ชๅๅ ฅๅ、ใใใฏใขใใ、ๅพฉๅ 、ๆดๅๆงใใงใใฏ、pgbench ใใณใใใผใฏใพใงใไฝ็ณป็ใซ่งฃ่ชฌใใพใใ。 ๅคง่ฆๆจกใใผใฟใฎๆง่ฝ่ฉไพก、ใทในใใ ๆค่จผ、็ฝๅฎณๅพฉๆงๆผ็ฟใซๅฉ็จใงใใๅฎ่ทต็ใชๆ้ ใจใใฆๆดป็จใงใใพใ。
ๆฒๆ็่จ:
ๅผต่ฒผ็่จ