Mộc Viên's Blog Mộc Viên's Blog
Hướng dẫn cài đặt PostgreSQL và một vài khái niệm cơ bản

Hướng dẫn cài đặt PostgreSQL và một vài khái niệm cơ bản

Ngày đăng:

Hướng dẫn cài đặt PostgreSQL và một vài khái niệm cơ bản

PostgreSQL là một hệ quản trị cơ sở dữ liệu quan hệ mã nguồn mở mạnh mẽ, thường được gọi là Postgres. Nó tuân theo chuẩn SQL và hỗ trợ nhiều tính năng nâng cao như JSON, indexing mạnh mẽ, và ACID compliance.

1. Cài đặt PostgreSQL

Trên các hệ điều hành khác nhau:

Ubuntu/Debian:

sudo apt update
sudo apt install postgresql postgresql-contrib

CentOS/RHEL:

sudo yum install postgresql-server postgresql-contrib
sudo postgresql-setup initdb
sudo systemctl start postgresql
sudo systemctl enable postgresql

Windows:

Tải từ trang chủ https://www.postgresql.org/download/ và cài đặt.

PostgreSQL: Downloads
💡
Khởi động PostgreSQL

2. Khởi động PostgreSQL

• Kiểm tra trạng thái:

sudo systemctl status postgresql

• Bắt đầu và bật PostgreSQL khi khởi động:

sudo systemctl start postgresql
sudo systemctl enable postgresql

3. Làm việc với PostgreSQL

Đăng nhập vào PostgreSQL:

sudo -i -u postgres
psql

Thoát khỏi psql:

\q

Tạo người dùng và cơ sở dữ liệu:

Tạo user mới (myuser) với mật khẩu (mypassword):

CREATE USER myuser WITH PASSWORD 'mypassword';

Tạo database mới (mydb) và gán quyền cho user:

CREATE DATABASE mydb;
GRANT ALL PRIVILEGES ON DATABASE mydb TO myuser;

Kết nối với database:

psql -U myuser -d mydb -h localhost

4. Các lệnh SQL cơ bản

Tạo bảng:

CREATE TABLE users (
    id SERIAL PRIMARY KEY,
    name VARCHAR(100),
    email VARCHAR(100) UNIQUE NOT NULL,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

Chèn dữ liệu:

INSERT INTO users (name, email) VALUES ('Alice', '[email protected]');

Truy vấn dữ liệu:

SELECT * FROM users;

Cập nhật dữ liệu:

UPDATE users SET name = 'Alice Smith' WHERE id = 1;

Xóa dữ liệu:

DELETE FROM users WHERE id = 1;

5. Các tính năng nâng cao

Indexing:

CREATE INDEX idx_users_email ON users(email);

JSON hỗ trợ:

CREATE TABLE data_store (
    id SERIAL PRIMARY KEY,
    data JSONB
);

INSERT INTO data_store (data) VALUES ('{"key": "value"}');

Backup & Restore

• Backup database:

pg_dump mydb > mydb_backup.sql

• Restore database:

psql mydb < mydb_backup.sql
💡
PostgreSQL rất mạnh mẽ và phù hợp với các ứng dụng từ nhỏ đến lớn.

Cách tạo bảng trong PgAdmin

Để tạo bảng trong pgAdmin, bạn làm theo các bước sau:

1. Mở pgAdmin và kết nối đến PostgreSQL

• Mở pgAdmin (nếu chưa cài, bạn có thể tải từ trang chủ PostgreSQL).

PostgreSQL: Downloads

• Trong Object Browser (bên trái), mở Servers > PostgreSQL > Databases.

• Chọn database bạn muốn tạo bảng (VD: mydb).

2. Tạo bảng mới

Cách 1: Dùng giao diện GUI

1. Nhấp chuột phải vào Tables > Chọn Create > Table.

2. Điền thông tin cơ bản:

Name: Nhập tên bảng (VD: users).

Schema: Chọn public (hoặc schema tùy chỉnh nếu có).

3. Chuyển sang tab Columns và thêm cột:

• Nhấn + để thêm cột mới.

• Nhập:

Name: id

Data type: SERIAL

Primary key: ✅ (tick chọn)

• Tiếp tục thêm cột:

• name - VARCHAR(100)

• email - VARCHAR(100) UNIQUE NOT NULL

• created_at - TIMESTAMP DEFAULT CURRENT_TIMESTAMP

4. Nhấn Save để tạo bảng.

Cách 2: Dùng Query Editor (SQL)

Nếu bạn thích dùng SQL, mở Query Tool và chạy lệnh sau:

CREATE TABLE users (
    id SERIAL PRIMARY KEY,
    name VARCHAR(100),
    email VARCHAR(100) UNIQUE NOT NULL,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

Nhấn Execute (biểu tượng tia sét ⚡) để tạo bảng.

3. Kiểm tra bảng đã tạo

• Vào Tables, nhấn F5 (Refresh) để thấy bảng mới.

• Nhấp chuột phải vào bảng users > View/Edit Data > All Rows để kiểm tra dữ liệu.

Bạn thích cách nào hơn, GUI hay SQL? 😊


Partitioned Table trong PostgreSQL là gì?

Partitioned Table (Bảng phân vùng) là một kỹ thuật trong PostgreSQL giúp chia nhỏ một bảng lớn thành nhiều bảng con (partition) dựa trên một tiêu chí nhất định. PostgreSQL quản lý các partition này một cách tự động khi bạn thực hiện SELECT, INSERT, UPDATE hoặc DELETE.

💡
Tại sao cần Partitioned Table?

Partitioned Table hữu ích khi:

1. Cải thiện hiệu suất truy vấn: PostgreSQL có thể quét chỉ các partition liên quan thay vì toàn bộ bảng.

2. Quản lý dữ liệu dễ dàng: Xóa một partition nhanh hơn nhiều so với xóa hàng loạt dữ liệu trong một bảng lớn.

3. Tăng tốc INSERT và UPDATE: Dữ liệu được chèn vào partition phù hợp mà không làm quá tải bảng chính.

4. Hỗ trợ lưu trữ dữ liệu lớn: Dữ liệu có thể trải rộng trên nhiều partition theo thời gian hoặc giá trị cụ thể.

5. Tối ưu hóa chỉ mục: Chỉ mục nhỏ hơn giúp truy vấn nhanh hơn.

💡
Cách tạo Partitioned Table

1. Tạo bảng chính (Partitioned Table)

Trước tiên, bạn tạo một bảng chính nhưng không chứa dữ liệu, chỉ đóng vai trò là bảng cha.

CREATE TABLE orders (
    id SERIAL PRIMARY KEY,
    order_date DATE NOT NULL,
    customer_id INT NOT NULL
) PARTITION BY RANGE (order_date);

Ở đây, dữ liệu sẽ được phân vùng dựa vào cột order_date.

2. Tạo các Partition

Mỗi partition chứa dữ liệu của một khoảng thời gian cụ thể.

CREATE TABLE orders_2023 PARTITION OF orders
    FOR VALUES FROM ('2023-01-01') TO ('2023-12-31');

CREATE TABLE orders_2024 PARTITION OF orders
    FOR VALUES FROM ('2024-01-01') TO ('2024-12-31');

📌 Lưu ý:

• Partition được tạo với FOR VALUES FROM ... TO ... để chỉ định phạm vi dữ liệu mà nó lưu trữ.

• Bạn có thể tạo nhiều partition cho từng năm/tháng tùy vào yêu cầu.

3. Chèn dữ liệu và PostgreSQL tự động điều hướng

INSERT INTO orders (order_date, customer_id) VALUES ('2023-06-15', 1);
INSERT INTO orders (order_date, customer_id) VALUES ('2024-02-10', 2);

📌 Dữ liệu sẽ tự động vào đúng partition mà không cần chỉ định trực tiếp.

4. Kiểm tra dữ liệu trong từng partition

SELECT * FROM orders_2023;
SELECT * FROM orders_2024;

Các kiểu phân vùng trong PostgreSQL

1. RANGE Partitioning (Phân vùng theo khoảng): Ví dụ như trên (phân vùng theo thời gian).

2. LIST Partitioning (Phân vùng theo danh sách giá trị cụ thể):

CREATE TABLE customers (
    id SERIAL PRIMARY KEY,
    region TEXT NOT NULL
) PARTITION BY LIST (region);

CREATE TABLE customers_north PARTITION OF customers FOR VALUES IN ('North');
CREATE TABLE customers_south PARTITION OF customers FOR VALUES IN ('South');

3. HASH Partitioning (Phân vùng theo giá trị băm): Dùng khi không thể chia nhỏ theo danh sách hoặc khoảng.

CREATE TABLE logs (
    id SERIAL PRIMARY KEY,
    event_type TEXT NOT NULL
) PARTITION BY HASH (id);

CREATE TABLE logs_p0 PARTITION OF logs FOR VALUES WITH (MODULUS 3, REMAINDER 0);
CREATE TABLE logs_p1 PARTITION OF logs FOR VALUES WITH (MODULUS 3, REMAINDER 1);
CREATE TABLE logs_p2 PARTITION OF logs FOR VALUES WITH (MODULUS 3, REMAINDER 2);

Lợi ích của Partitioned Table so với Table thông thường

Tiêu chí

Bảng Thông Thường

Partitioned Table

Hiệu suất truy vấn

Chậm khi bảng lớn

Nhanh hơn do chỉ quét partition cần thiết

Xóa dữ liệu

DELETE tốn tài nguyên

DROP PARTITION nhanh chóng

Chỉ mục

Toàn bộ bảng sử dụng 1 chỉ mục lớn

Chỉ mục riêng cho từng partition

INSERT/UPDATE

Có thể gây tắc nghẽn

Phân tán tải, giảm tắc nghẽn

Khi nào dùng Partitioned Table?

Dùng khi:

• Bảng rất lớn (> vài triệu dòng).

• Dữ liệu có thể phân chia theo ngày/tháng hoặc danh mục.

• Truy vấn chỉ tập trung vào một phần dữ liệu.

Không cần dùng khi:

• Bảng có ít dữ liệu (dưới vài trăm nghìn dòng).

• Không có tiêu chí rõ ràng để phân vùng.

💡
Bạn đang làm việc với dữ liệu nào mà muốn dùng Partitioned Table?

Khi phân vùng, SELECT có cần tên bảng chính hay tên partition?

🔹 Câu trả lời:

Bạn chỉ cần truy vấn trên bảng chính, PostgreSQL sẽ tự động quét partition phù hợp để lấy dữ liệu.

Cách SELECT trên Partitioned Table

Giả sử bạn có bảng phân vùng orders (đã phân vùng theo order_date), với hai partition:

CREATE TABLE orders (
id SERIAL PRIMARY KEY,
order_date DATE NOT NULL,
customer_id INT NOT NULL
) PARTITION BY RANGE (order_date);

CREATE TABLE orders_2023 PARTITION OF orders
FOR VALUES FROM ('2023-01-01') TO ('2023-12-31');

CREATE TABLE orders_2024 PARTITION OF orders
FOR VALUES FROM ('2024-01-01') TO ('2024-12-31');

1. Truy vấn toàn bộ bảng (Tự động chọn partition)

SELECT * FROM orders WHERE order_date BETWEEN '2023-06-01' AND '2023-06-30';

👉 PostgreSQL chỉ quét partition orders_2023, không đụng đến orders_2024, giúp tăng tốc truy vấn.

2. Truy vấn trên từng partition riêng lẻ

Nếu muốn truy vấn trực tiếp trên partition cụ thể:

SELECT * FROM orders_2023 WHERE order_date = '2023-06-15';

👉 Lưu ý: Cách này ít dùng, vì nó không tận dụng được cơ chế quản lý tự động của PostgreSQL.

3. Kiểm tra PostgreSQL có tối ưu quét partition không?

Bạn có thể dùng EXPLAIN ANALYZE để kiểm tra PostgreSQL có tự động tối ưu truy vấn không:

EXPLAIN ANALYZE
SELECT * FROM orders WHERE order_date = '2023-06-15';

Nếu phân vùng hoạt động đúng, bạn sẽ thấy PostgreSQL chỉ truy vấn partition cần thiết, thay vì quét toàn bộ bảng.

Kết luận

Dùng tên bảng chính (orders) khi SELECT, PostgreSQL sẽ tự động chọn partition.

✔ Nếu thực sự cần, bạn có thể SELECT trực tiếp từ partition (orders_2023), nhưng ít cần thiết.

✔ Dùng EXPLAIN ANALYZE để kiểm tra PostgreSQL có tối ưu truy vấn không.


Gần đây