็†ฑ้–€ๅˆ†้กž
 ่ผ‰ๅ…ฅไธญ…
็›ฎ้Œ„

๐Ÿ“Š PostgreSQL ๅคง่ฆๆจกใƒ‡ใƒผใ‚ฟๅฎŸ่ฃ…:50ไธ‡ไปถใฎใƒ‡ใƒผใ‚ฟ็”Ÿๆˆ・ใƒ•ใ‚ฃใƒผใƒซใƒ‰ๅ…ฅๅŠ›・ใƒใƒƒใ‚ฏใ‚ขใƒƒใƒ—・ๅพฉๅ…ƒ・ๆ€ง่ƒฝใƒ™ใƒณใƒใƒžใƒผใ‚ฏๅฎŒๅ…จใ‚ฌใ‚คใƒ‰

    ๐Ÿ“Š 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.gztar -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_dumppg_dump postgres็ด„ 9.2็ง’ใƒ†ใ‚ญใ‚นใƒˆใƒ™ใƒผใ‚นๅ‡บๅŠ›
    gzip ๅœง็ธฎgzip postgres.sql็ด„ 3.4็ง’ๅฎน้‡็ด„11MBใซ็ธฎๅฐ
    tar.gztar -czvf็ด„ 3.8็ง’่ค‡ๆ•ฐใƒ•ใ‚กใ‚คใƒซใพใจใ‚ๅฏ่ƒฝ
    psql ๅพฉๅ…ƒpsql testdb2 < postgres.sql็ด„ 15.6็ง’COPY ๆ–นๅผใง้ซ˜้€Ÿ
    checksum ๆฏ”่ผƒstring_agg + md5็ด„ 2.1็ง’ๅฎŒๅ…จๆ•ดๅˆๆ€งใƒใ‚งใƒƒใ‚ฏ

    ็’ฐๅขƒใซใ‚‚ใ‚ˆใ‚Šใพใ™ใŒ、ใƒใƒƒใ‚ฏใ‚ขใƒƒใƒ—〜ๅพฉๅ…ƒ〜ๆ•ดๅˆๆ€งๆคœ่จผใพใงๅˆ่จˆ 30〜35็ง’ใงๅฎŒไบ†ใ—ใพใ™。


    ๐Ÿ ใพใจใ‚

    ๆœฌ่จ˜ไบ‹ใงใฏ、PostgreSQL ใ‚’็”จใ„ใฆ 50ไธ‡ไปถใฎใƒ‡ใƒผใ‚ฟ็”Ÿๆˆ、ใƒ•ใ‚ฃใƒผใƒซใƒ‰่‡ชๅ‹•ๅ…ฅๅŠ›、ใƒใƒƒใ‚ฏใ‚ขใƒƒใƒ—、ๅพฉๅ…ƒ、ๆ•ดๅˆๆ€งใƒใ‚งใƒƒใ‚ฏ、pgbench ใƒ™ใƒณใƒใƒžใƒผใ‚ฏใพใงใ‚’ไฝ“็ณป็š„ใซ่งฃ่ชฌใ—ใพใ—ใŸ。 ๅคง่ฆๆจกใƒ‡ใƒผใ‚ฟใฎๆ€ง่ƒฝ่ฉ•ไพก、ใ‚ทใ‚นใƒ†ใƒ ๆคœ่จผ、็ฝๅฎณๅพฉๆ—งๆผ”็ฟ’ใซๅˆฉ็”จใงใใ‚‹ๅฎŸ่ทต็š„ใชๆ‰‹้ †ใจใ—ใฆๆดป็”จใงใใพใ™。


    ๐Ÿ“š ้–ข้€ฃ่จ˜ไบ‹

    ๐Ÿ”— ๅˆ†ไบซ้€™็ฏ‡ LINE Facebook X

    ๆฒ’ๆœ‰็•™่จ€:

    ๅผต่ฒผ็•™่จ€

    ๅญ—็ดš