Bạn đã bao giờ lâm vô hoàn cảnh "dở khó dở cười" sau: Bạn nấu một nồi bún bò cho cả nhà 4 người ăn, ai cũng khen nức nở! Vậy là có ý kiến: Chủ nhật này làm một nồi lớn, mời hết bạn bè đâu đó 20 người tới ăn. Và...nồi bún ngày Chủ Nhật hoàn toàn "không có cửa" khi so với nồi bún tuyệt hảo 4 người ăn!
Có một hiện tượng rất kỳ lạ.Lúc mới làm website.
Mọi thứ đều nhanh.
Click.
↓
Có ngay.
😎
Một tháng sau.
Vẫn ổn.
Ba tháng sau.
Bắt đầu thấy hơi chậm.
Một năm sau.
Mỗi lần bấm nút.
Bạn chỉ biết nhìn...
Loading...
Loading...
Loading...
😭
Điều buồn cười là:
Bạn không hề sửa code nhiều.
Hosting vẫn vậy.
PHP vẫn vậy.
MySQL vẫn vậy.
Thế...
Tại sao website lại chậm dần?
Hôm nay chúng ta sẽ cùng "mổ xẻ" hiện tượng này theo kiểu đời thường.
Không benchmark.
Không thuật ngữ khó.
Chỉ toàn những ví dụ ai cũng hiểu.
😄
Database chạy chậm là gì?
Database chạy chậm là tình trạng các câu truy vấn (SQL Query) mất nhiều thời gian hơn để lấy dữ liệu.
Nguyên nhân có thể đến từ:
- Dữ liệu ngày càng nhiều
- Query chưa tối ưu
- Thiếu Index
- JOIN quá nhiều bảng
- Hosting yếu
- Hoặc thiết kế database chưa hợp lý.
Ví dụ đời thường 🍜
Hãy tưởng tượng.
Ngày đầu tiên.
Bạn mở một quán phở.
Có:
3 khách.
Bác đầu bếp rất thong thả.
Khách gọi.
↓
Có ngay.
😄
Một năm sau.
Quán nổi tiếng.
Có:
300 khách.
Đầu bếp vẫn chỉ có một người.
😅
Lúc này.
Không phải đầu bếp kém đi.
Mà vì...
Khách quá đông.
Database cũng vậy.
Ngày đầu:
100 dòng dữ liệu.
↓
Nhanh.
Hai năm sau:
2 triệu dòng.
↓
Chậm hơn là chuyện bình thường.
Dữ liệu càng nhiều càng phải tìm lâu hơn
Giả sử bạn có một quyển sổ.
Chỉ 20 trang.
Muốn tìm tên:
Nguyễn Văn Nam.
↓
Mất vài giây.
😄
Nhưng nếu quyển sổ dày:
15.000 trang.
↓
Bạn sẽ phải lật lâu hơn.
Database cũng đang làm đúng việc đó.
Chỉ là...
Nó đang lật nhanh hơn con người rất nhiều.
😄
SELECT * - "Căn bệnh" của người mới 😅
Người mới rất thích:
SELECT *
FROM users;Vì đơn giản.
Khỏi phải nhớ tên cột.
😎
Nhưng thử tưởng tượng.
Bạn vào quán cà phê.
Chỉ muốn uống:
Một ly cà phê đen.
Nhân viên lại mang ra:
☕
Cà phê.
🍰
Bánh ngọt.
🥤
Nước ép.
🍜
Mì.
🍚
Cơm.
🍧
Kem.
...
Bạn chỉ cần một món.
Nhưng họ bê nguyên cái menu ra bàn.
🤡
SELECT *
cũng giống vậy.
Nếu chỉ cần:
Tên.
Email.
Thì đừng lấy luôn:
Ảnh.
Địa chỉ.
Ngày sinh.
Mật khẩu hash.
Lịch sử đăng nhập.
...
Lấy ít hơn.
Nhanh hơn.
😎
Thiếu Index - Đi tìm sách không có mục lục 📚
Đây là nguyên nhân cực kỳ phổ biến.
Bạn bước vào thư viện.
Có:
500.000 quyển sách.
Nếu có mục lục.
↓
Tìm rất nhanh.
Nếu không có mục lục.
↓
Đi từng kệ.
↓
Từng hàng.
↓
Từng cuốn.
😭
Index trong MySQL cũng giống như:
Mục lục của thư viện.
Không có Index.
Database phải dò từng dòng.
Có Index.
Database biết gần như ngay dữ liệu nằm ở đâu.
JOIN quá nhiều bảng 😵
JOIN rất tuyệt.
Nhưng...
Nếu bạn JOIN:
2 bảng.
Ổn.
JOIN:
3 bảng.
Vẫn ổn.
JOIN:
8 bảng.
JOIN tiếp.
Subquery.
Lại JOIN.
😅
Database sẽ phải chạy đi chạy lại giữa rất nhiều bảng.
Giống như bạn phải xin đủ:
✔ Phòng nhân sự
✔ Phòng kế toán
✔ Phòng kho
✔ Phòng bán hàng
✔ Phòng vận chuyển
Mỗi lần hỏi thêm một nơi.
Lại tốn thêm thời gian.
Điều này không có nghĩa là JOIN xấu.
Chỉ là...
Dùng vừa đủ.
😄
Query lặp đi lặp lại 🤡
Đây là lỗi rất nhiều người mới không để ý.
Ví dụ.
Bạn hiển thị:
20 sản phẩm.
Mỗi sản phẩm lại chạy thêm:
SELECT ...để lấy tên người bán.
20 sản phẩm.
↓
20 câu SQL.
😅
Trong khi.
Hoàn toàn có thể viết:
Một câu JOIN.
Lấy tất cả.
Đây là một trong những nguyên nhân khiến website đông người truy cập thì bắt đầu "đuối".
Hosting miễn phí cũng có giới hạn
InfinityFree rất tuyệt để học.
Mình cũng từng khuyên nhiều bạn bắt đầu từ đó.
Nhưng.
Hosting miễn phí không thể mạnh bằng VPS hoặc hosting trả phí.
Nếu website có:
- nhiều người truy cập
- database lớn
- nhiều plugin
- nhiều truy vấn
Thì việc chậm hơn là điều dễ hiểu.
Không phải vì code sai.
Mà vì "chiếc xe máy đang phải kéo cả xe tải."
😄
Một hiểu lầm rất phổ biến 🤡
Nhiều người nghĩ:
"Database chậm.
Chắc phải mua server mới."
Không hẳn.
Có những website.
Chỉ sửa vài câu SQL.
↓
Tốc độ tăng gấp nhiều lần.
Trong khi.
Không nâng hosting.
Không thêm RAM.
Không đổi CPU.
Đó là lý do lập trình viên luôn:
Tối ưu trước.
Nâng cấp phần cứng sau.
InfinityFree Case 😅
Có bạn gửi mình đoạn code:
SELECT * FROM products;Database có:
Hơn 30.000 sản phẩm.
Nhưng trang chủ chỉ hiển thị:
12 sản phẩm.
🤡
MySQL vẫn lấy:
30.000 dòng.
PHP nhận:
30.000 dòng.
Sau đó mới cắt còn:
😅
Trong khi chỉ cần:
SELECT *
FROM products
LIMIT 12;Là đủ.
Website nhẹ hơn thấy rõ.
Đây cũng là lý do bạn nên đọc bài LIMIT trong MySQL là gì?
😎
Cache cũng giúp database "đỡ mệt"
Hãy tưởng tượng.
Có 1.000 người.
Đều hỏi:
"Mấy giờ mở cửa?"
Nếu mỗi người hỏi.
Bạn đều chạy xuống kho kiểm tra.
↓
Mệt.
😅
Nếu bạn viết lên bảng:
"Mở cửa lúc 8 giờ."
↓
Ai cũng tự đọc.
Cache hoạt động gần giống như vậy.
Những dữ liệu ít thay đổi.
Không nhất thiết phải hỏi database liên tục.
Debug kiểu dev thật 😎
✅ 1. Chỉ SELECT những cột cần dùng
Đừng dùng SELECT * nếu không cần.
✅ 2. Dùng LIMIT khi debug
Đừng tải hàng chục nghìn dòng chỉ để xem vài bản ghi đầu tiên.
✅ 3. Kiểm tra câu SQL chạy bao lâu
Đừng đoán.
Hãy đo.
✅ 4. Xem có đang JOIN quá nhiều bảng không
Đôi khi tách nhỏ truy vấn lại hiệu quả hơn.
✅ 5. Nghĩ đến Index
Nếu thường xuyên tìm kiếm theo:
username
id
...
Rất có thể cột đó nên có Index.
Checklist chuẩn không cần chỉnh 😎
☑ Không lạm dụng SELECT *
☑ Dùng LIMIT khi cần
☑ Thiết kế database hợp lý
☑ Tránh query lặp nhiều lần
☑ Sử dụng JOIN hợp lý
☑ Tạo Index cho các cột thường tìm kiếm
☑ Backup trước khi tối ưu database
FAQ nhanh
Database lớn có nhất định chậm không?
→ Không.
Database hàng trăm triệu dòng vẫn có thể rất nhanh nếu thiết kế tốt.
Hosting mạnh có giải quyết được mọi thứ?
→ Không.
Code và SQL chưa tối ưu thì hosting mạnh cũng chỉ giúp được một phần.
Có nên xóa bớt dữ liệu?
→ Chỉ khi dữ liệu thực sự không còn cần thiết.
Đừng xóa chỉ vì nghĩ "ít dữ liệu sẽ nhanh hơn".
Bạn có thể cũng đang gặp 😭
👉 mysqli vs PDO - chọn cái nào?
👉 AUTO_INCREMENT hoạt động ra sao?
👉 Vì sao xóa dữ liệu rồi ID vẫn tăng?
👉 Backup database đúng cách trước khi "toang"
Tổng kết
Database không tự nhiên chậm đi.
Nó chỉ đang phải làm việc nhiều hơn.
Giống như một quán ăn.
Lúc mới khai trương.
Có vài khách.
Mọi thứ rất nhanh.
Sau này.
Khách ngày càng đông.
Nếu vẫn giữ cách làm cũ.
Chắc chắn sẽ bắt đầu ùn tắc.
Website cũng vậy.
Đừng vội đổ lỗi cho MySQL.
Hay hosting.
Hoặc PHP.
Rất nhiều trường hợp.
Chỉ cần sửa vài câu SQL.
Thêm một vài Index.
Bỏ bớt SELECT *.
Hoặc giảm những truy vấn không cần thiết.
Website đã nhanh lên đáng kể.
Và nếu bạn chỉ nhớ một điều từ bài này, hãy nhớ:
Database không ghét dữ liệu nhiều.
Database chỉ ghét những câu truy vấn chưa được tối ưu. 🚀