Giới thiệu

Query chậm làm giảm trải nghiệm Dashboard. Prisma + MySQL cần tối ưu để đáp ứng thời gian phản hồi dưới 200ms.

Thêm index vào MySQL

Index giảm số lần quét bảng. Thêm index cho cột thường dùng trong WHEREORDER BY.

CREATE INDEX idx_orders_user_id ON orders (user_id);
CREATE INDEX idx_products_category ON products (category_id);

Sau khi tạo, EXPLAIN xác nhận type chuyển từ ALL sang ref hoặc range.

Chọn trường cần thiết với select

Prisma trả về toàn bộ cột nếu không chỉ định. Dùng select để giảm payload.

const orders = await prisma.order.findMany({
  where: { userId: 123 },
  select: {
    id: true,
    total: true,
    createdAt: true,
    // bỏ các cột không cần
  }
});

Giảm dữ liệu truyền về giúp React render nhanh hơn.

Sử dụng raw query cho truy vấn phức tạp

Prisma findMany không hỗ trợ GROUP BY hiệu quả. Dùng $queryRaw khi cần.

const revenue = await prisma.$queryRaw`
  SELECT SUM(total) AS revenue
  FROM orders
  WHERE created_at BETWEEN ${startDate} AND ${endDate}
`;

Escaped backticks giữ an toàn SQL injection.

Kết nối pool trong Docker

Docker compose thường khởi tạo một container DB. Đặt maxConnections phù hợp để tránh quá tải.

services:
  db:
    image: mysql:8
    environment:
      MYSQL_ROOT_PASSWORD: secret
    ports:
      - "3306:3306"
    command: --default-authentication-plugin=mysql_native_password --max-connections=200

Trong Prisma schema, cấu hình pool_timeoutconnection_limit:

datasource db {
  provider = "mysql"
  url      = env("DATABASE_URL")
  connection_limit = 20
}

Caching với Tanstack Query

Tanstack Query lưu cache trong bộ nhớ, giảm số lần gọi API.

const useOrders = (userId) => {
  return useQuery([
    'orders', userId],
    () => fetch(`/api/orders?userId=${userId}`).then(r => r.json()),
    { staleTime: 1000 * 60 * 5 } // 5 phút
  );
};

Kết hợp Zustand để chia sẻ trạng thái giữa các component mà không gây re‑render toàn bộ.

Kết luận

Thêm index, giảm trường trả về, dùng raw query khi cần, cấu hình pool, và cache Tanstack Query mang lại Dashboard nhanh, ổn định.

Muốn học chi tiết toàn bộ quy trình xây dựng Dashboard, Tham khảo khóa học "[Full Course] Ecommerce Dashboard Fullstack Clone" tại đây.