Xử lý large dataset trong MySQL (hàng chục triệu → trăm triệu record) cần chia theo nhiều lớp: thiết kế schema → index → query → partition → hạ tầng.

Dưới đây là checklist thực chiến 👇


1️⃣ Thiết kế bảng đúng ngay từ đầu

✅ Chọn Engine

  • Dùng InnoDB (mặc định)
  • Tránh MyISAM

✅ Kiểu dữ liệu nhỏ nhất có thể

  • INT thay vì BIGINT nếu không cần
  • VARCHAR(100) thay vì TEXT
  • Tránh NULL nếu không cần

Ví dụ:

user_id INT UNSIGNED NOT NULL

2️⃣ Index đúng cách (cực kỳ quan trọng)

✅ Index cho:

  • WHERE
  • JOIN
  • ORDER BY
  • GROUP BY

Ví dụ:

CREATE INDEX idx_user_created ON orders(user_id, created_at);

⚠️ Lưu ý

  • Không index quá nhiều (ghi sẽ chậm)
  • Dùng composite index đúng thứ tự điều kiện

3️⃣ Tránh OFFSET lớn (rất quan trọng)

Sai:

SELECT * FROM orders
LIMIT 1000000, 20;

→ MySQL phải scan 1 triệu dòng

✅ Dùng Keyset Pagination

SELECT * FROM orders
WHERE id > 1000000
LIMIT 20;

Nhanh hơn rất nhiều.


4️⃣ Partition table (khi > 10M rows)

Chia bảng theo:

  • RANGE (theo date)
  • HASH (theo id)

Ví dụ partition theo tháng:

PARTITION BY RANGE (YEAR(created_at)) (
    PARTITION p2024 VALUES LESS THAN (2025),
    PARTITION p2025 VALUES LESS THAN (2026)
);

👉 Giúp MySQL chỉ scan partition cần thiết.


5️⃣ Tách bảng (Sharding nhẹ)

Ví dụ:

  • orders_2024
  • orders_2025

Hoặc:

  • user_0 → user_9 (theo hash)

6️⃣ Batch processing thay vì load toàn bộ

Sai:

SELECT * FROM big_table;

Đúng:

SELECT * FROM big_table
WHERE id BETWEEN 1 AND 10000;

Xử lý theo batch 10k record.


7️⃣ Streaming thay vì load vào RAM

PHP:

PDO::MYSQL_ATTR_USE_BUFFERED_QUERY => false

Tránh OOM.


8️⃣ Dùng Read Replica

1 server:

  • Primary (write)
  • Replica (read)

Scale đọc rất tốt.


9️⃣ Tối ưu cấu hình MySQL

Trong my.cnf:

innodb_buffer_pool_size = 70% RAM
innodb_log_file_size = 1G
max_connections = 200

Kiểm tra:

SHOW ENGINE INNODB STATUS;

🔟 Archive dữ liệu cũ

Ví dụ:

  • dữ liệu > 2 năm → chuyển sang bảng archive
  • hoặc dump ra file

Giảm size bảng active.


1️⃣1️⃣ Dùng đúng tool khi dataset quá lớn

Khi cần search full text hoặc analytics lớn:

  • Dùng Elasticsearch
  • Hoặc dùng ClickHouse
  • Hoặc chuyển sang PostgreSQL nếu cần advanced index (GIN, BRIN, vector)

1️⃣2️⃣ Monitoring

Dùng:

  • slow query log
  • EXPLAIN
  • SHOW PROCESSLIST

Hoặc tool nhẹ:

  • Netdata
  • Percona Toolkit

🎯 Nếu chia theo scale thực tế:

SizeCách xử lý
< 1MIndex đúng là đủ
1M–10MKeyset pagination
10M–100MPartition + Replica
> 100MSharding / DB chuyên biệt