2012-04-26 14 views
7

Tôi có một trò chơi trực tuyến theo lượt, với rất nhiều trò chơi chạy cùng một lúc. Tôi đang trong quá trình tối ưu hóa mã, vì cả tôi và máy chủ đều gặp sự cố ngày hôm nay.1,3 triệu truy vấn/Giờ. Bạn sẽ xây dựng các truy vấn như thế nào?

Đây là thiết lập:

Ngay bây giờ tôi có một bảng, "trận đấu" (70 lĩnh vực dữ liệu cho mỗi hàng Cấu trúc.), Mà theo dõi tất cả các trận đấu tích cực. Cứ sau 7 giây, iphone sẽ kết nối, tải xuống tất cả các trận đấu trong bảng "trận đấu" mà anh/cô ấy đang hoạt động và cập nhật giao diện người dùng trong iphone.

Điều này làm việc tuyệt vời cho đến khoảng 1.000 người đã tải xuống trò chơi và chơi. Máy chủ bị lỗi.

Vì vậy, để tối ưu hóa, tôi hình tôi có thể tạo một bảng mới có tên là "matches_needs_update". Bảng này có 2 hàng; tên và id. "Id" giống với "đối sánh" trong bảng "phù hợp". Khi một trận đấu được cập nhật, nó sẽ được đưa vào bảng này.

Bây giờ, thay vì tìm kiếm trong toàn bộ bảng "phù hợp", truy vấn chỉ kiểm tra xem trình phát có bất kỳ kết quả nào cần được cập nhật hay không và sau đó nhận các kết quả phù hợp đó từ bảng "kết quả phù hợp".

Câu hỏi của tôi là hai khía cạnh:

  1. Đây có phải là giải pháp tối ưu?
  2. Nếu người chơi đang hoạt động, nói 10 trận đấu, có cách nào tốt để nhận 10 trận đấu đó từ bảng "trận đấu" cùng một lúc hay tôi cần vòng lặp for thực hiện 10 truy vấn, mỗi câu trả lời cho mỗi khớp:

    "SELECT * FROM matches WHERE id =?"

Cảm ơn trước

+6

Trong khi vấn đề là nghiêm trọng, đây là một trong những loại vấn đề tốt nhất bạn có thể có, nếu bạn nghĩ về nó. Việc bẻ khóa từ quá nhiều người dùng thực sự là loại lỗi tốt nhất. – Cyclone

+1

Giải pháp sử dụng Thông báo đẩy có thể là cách tốt hơn để khắc phục sự cố hiệu suất. Bằng cách đó bạn sẽ không có nhiều kiểm tra lần lượt dư thừa –

+1

Nó gần như âm thanh như 1 người có thể hoạt động trong nhiều trận đấu, và nhiều người có thể hoạt động trong 1 trận đấu? Chắc chắn bạn phải có 3 bàn? – DanRedux

Trả lời

6

Tôi đề nghị APC ...

... như bạn đang ở trên PHP, và tôi giả sử bạn đang làm điều này từ một cơ sở dữ liệu mysql duy nhất,

Thật dễ dàng để cài đặt, và sẽ được mặc định từ PHP 6 trở đi.

Giữ 1 bảng này trong bộ nhớ và nó sẽ bay.

+0

Cảm ơn bạn đã trả lời. Tôi có cần phải cập nhật tất cả các mã php của tôi để xử lý nó, hoặc là nó chỉ để cài đặt? Cảm ơn – BlackMouse

+0

APC là 2 điều. Đó là một bộ nhớ cache opcode (lưu trữ mã PHP để nó tải nhanh hơn) và một bộ nhớ trong kho (tức là khóa-giá trị). Phần đầu tiên diễn ra tự động và tăng tốc. Nhưng bạn quan tâm đến bit thứ hai. Vì vậy, có - bạn cần phải cập nhật mã của bạn. Đọc trang hướng dẫn tôi đã liên kết và bắt đầu với apc_store để có ý tưởng. – HappyTimeGopher

7

Bạn cần phải thoát ra khỏi cơ sở dữ liệu. Nhìn vào memcache hoặc redis.

2

Cơ sở dữ liệu của bạn trông rất nhỏ. Một bảng với 70 hàng sẽ trả về trong vòng mili giây và thậm chí hàng trăm truy vấn mỗi giây sẽ hoạt động mà không có bất kỳ sự cố nào.

Một số lời khuyên truyền thống

  • Hãy chắc chắn rằng bạn hồ bơi kết nối của bạn. Bạn không bao giờ phải thực hiện kết nối khi khách hàng cần dữ liệu.
  • Đảm bảo có chỉ mục về "người dùng đang ở trong trận đấu" để kết quả sẽ được tìm nạp từ chỉ mục.
  • Tôi chắc rằng bạn có đủ bộ nhớ để giữ toàn bộ cấu trúc trong bộ nhớ cache và với các bảng nhỏ này, không cần cấu hình bổ sung.
  • Đảm bảo giản đồ của bạn được chuẩn hóa.Một bảng cho mỗi người dùng. Một cho mỗi trận đấu. Và một cho mỗi người dùng trong một trận đấu.
1

Thời gian bắt đầu bộ nhớ đệm, ví dụ như memcache và apc.

Đối với vòng lặp mặc dù các kết quả phù hợp ... đó là cách sai lầm để đi về nó.

Người dùng được kết nối với trận đấu bằng tab xref như thế nào? hoặc bảng so khớp có somthing như player1, player2.

Lặp lại truy vấn mặc dù không phải là cách để đi đúng cách lập chỉ mục các bảng của bạn và thực hiện một phép nối để kéo tất cả các kết quả hoạt động của một userId làm tôi hiệu quả hơn. Givin số lượng người dùng bạn cũng có thể muốn (nếu bạn không thích) chia bảng cho các trò chơi hoạt động và không hoạt động.

Nếu theres 6000 trò chơi đang hoạt động và 3.000.000 không hoạt động thì cực kỳ có lợi để phân vùng các bảng này.

Các vấn đề liên quan