MySQL hoạt động ở tầng hiệu năng

Nắm chắc cách MySQL hoạt động ở tầng hiệu năng, không chỉ biết CRUD hay query thông thường.

1. Performance Tuning (Tối ưu hiệu năng tổng thể)

Bạn cần hiểu cách MySQL tiêu tốn tài nguyên và cách cấu hình để tối ưu.

  • Server-level tuning:
    • innodb_buffer_pool_sizequery_cache_sizetmp_table_sizemax_connectionsinnodb_flush_log_at_trx_commit — hiểu công dụng, khi nào chỉnh.
    • Xác định bottleneck qua SHOW STATUSSHOW ENGINE INNODB STATUS.
  • Schema-level tuning:
    • Chọn kiểu dữ liệu phù hợp (INT vs BIGINTCHAR vs VARCHAR).
    • Thiết kế quan hệ và ràng buộc hợp lý để tránh join nặng.
  • Connection & pool tuning khi backend dùng ORM (Laravel Eloquent):
    Tránh N+1 query, bật query caching hợp lý, và batch insert/update.

2. Indexing (Tối ưu chỉ mục)

Bạn cần hiểu sâu cách MySQL dùng chỉ mục.

  • Loại index: B-Tree, Hash (trên MEMORY engine), Fulltext, Composite.
  • Khi nào index hữu ích:
    • WHERE, JOIN, ORDER BY, GROUP BY – nhưng phải đúng thứ tự cột.
  • Composite index: quy tắc “leftmost prefix”.
    • Ví dụ: index (user_id, created_at) có hiệu lực cho WHERE user_id = ? và WHERE user_id = ? AND created_at > ?nhưng không cho WHERE created_at > ? riêng.
  • Over-indexing: nhiều index → làm INSERT/UPDATE chậm, bạn cần biết cách cân đối.

3. Query Optimization

Khi query phức tạp (JOIN nhiều bảng, GROUP BY, ORDER BY, subquery), bạn cần biết:

  • Sử dụng EXPLAIN để xem query plan (key, type, rows, extra).
  • Tối ưu bằng:
    • Giảm join nếu không cần thiết.
    • Chuyển subquery thành join hoặc CTE.
    • Dùng index phù hợp với WHERE + ORDER BY cùng lúc.
  • Denormalization hợp lý:
    Khi load data nặng, bạn có thể lưu sẵn dữ liệu tổng hợp (materialized view / summary table).
  • Caching layer: Redis hoặc query cache trong Laravel để tránh query lặp.

4. Laravel Context (thực tế trong công việc)

  • Tránh N+1 bằng with() hoặc load().
  • Dùng chunk()cursor() cho dataset lớn.
  • Query log + DB::listen() để tìm query chậm.
  • Cấu hình slow_query_log trên MySQL để theo dõi query > X ms.
  • Khi cần: viết query tay (raw SQL) thay vì rely hoàn toàn vào Eloquent.

5. Thực tế yêu cầu

  • Giải thích vì sao query này chậm và cách tối ưu.
  • Viết SQL truy vấn nhanh hơn từ ví dụ thực tế.
  • So sánh INNER JOIN vs EXISTS trong tối ưu hóa.
  • Cách bạn debug query chậm trong production.
  • Khi nào bạn dùng index hint.