Bạn đang tìm kiếm sự cân bằng nào? Nếu bạn sẵn sàng để đưa ra một hit hiệu suất nhỏ trên chèn các thực thể này, bạn có thể tạo ra một giải pháp để có được N của họ rất nhanh chóng.
Đây là những gì bạn cần làm:
Khi bạn chèn Thực thể, hãy chỉ định khóa. Bạn muốn cung cấp chìa khóa cho các thực thể của bạn theo thứ tự, bắt đầu bằng 1 và đi lên từ đó. (Điều này sẽ yêu cầu một số nỗ lực, vì công cụ ứng dụng không có autoincrement() vì vậy bạn sẽ cần phải theo dõi id cuối cùng bạn đã sử dụng trong một số thực thể khác, hãy gọi nó là IdGenerator)
Bây giờ khi bạn cần N thực thể ngẫu nhiên, tạo ra N số ngẫu nhiên giữa 1 và bất kỳ id cuối cùng bạn tạo ra là (IdGenerator của bạn sẽ biết điều này). Sau đó bạn có thể thực hiện một đợt lấy bằng khóa bằng cách sử dụng các phím N, sẽ chỉ yêu cầu một chuyến đi đến kho dữ liệu, và sẽ nhanh hơn truy vấn, vì các khóa được thường nhanh hơn truy vấn, AFAIK.
Phương pháp này không đòi hỏi phải làm việc với một vài chi tiết gây phiền nhiễu:
- IdGenerator của bạn có thể trở thành một nút cổ chai nếu bạn đang chèn rất nhiều các mặt hàng này một cách nhanh chóng (hơn một vài giây), mà sẽ yêu cầu một số loại triển khai IdGenerator bị loại bỏ.Nếu tất cả dữ liệu này được tải trước hoặc không có khối lượng lớn, bạn sẽ dễ dàng.
- Bạn có thể thấy rằng một số Id không thực sự có một thực thể liên kết với nó nữa, bởi vì bạn đã xóa nó hoặc vì một put() không thành công ở đâu đó. Nếu điều này xảy ra, bạn phải lấy một thực thể ngẫu nhiên khác. (Nếu bạn muốn trở nên ưa thích và giảm tỷ lệ cược này, bạn có thể làm cho Id này có sẵn cho IdGenerator để tái sử dụng để "điền vào các lỗ")
Vì vậy, câu hỏi đặt ra là bạn cần bao nhiêu các mục so với mức độ thường xuyên bạn sẽ thêm và xóa chúng và liệu độ phức tạp thêm có đáng để tăng hiệu suất hay không.
Nguồn
2009-07-09 18:49:10
tôi đã tạo ra một vấn đề cho điều này, bạn có thể sao nó để giúp nó cố định: https://code.google.com/p/googleappengine/issues/detail?id=9044 –