Tôi đang gặp nhiều rắc rối với sự không hiệu quả của node_save (). Nhưng nút có cứu được vấn đề của tôi không? Cuối cùng đó là những gì tôi đang cố gắng tìm hiểu.
Tôi đã tạo ra một vòng lặp với 100.000 lần lặp. Tôi đã tạo mức tối thiểu để đối tượng nút có hiệu lực và lưu chính xác. Đây là mã lưu nút:
$node = new stdClass();
$node->type = "test_page";
node_object_prepare($node);
$node->uid = 1;
$node->title = $node_title;
$node->status = 1;
$node->language = LANGUAGE_NONE;
if($node = node_submit($node)){
node_save($node);
}
Đây là kết quả:
100.000 nút đã được lưu, mỗi nút sử dụng node_save (). Phải mất 5196,22 giây để hoàn thành. Đó là CHỈ 19 tiết kiệm một giây.
Để nói rằng, điều đó không được chấp nhận, đặc biệt là khi người này nhận được khoảng 1200 truy vấn chèn riêng lẻ mỗi giây và người này đang nhận được 25.000 lần chèn mỗi giây .
Vì vậy, những gì đang xảy ra ở đây? Nút thắt ở đâu? Đây có phải là hàm với hàm_s_save () không và nó được thiết kế như thế nào?
Nó có thể là phần cứng của tôi? Phần cứng của tôi là một máy chủ phát triển, không có ai trên đó ngoại trừ tôi - Intel dual core, 3Ghz, Ubuntu 12.04 với 16 hợp đồng ram.
Trong khi vòng lặp chạy sử dụng tài nguyên của tôi là: CPU 27% MySQL, RAM 6M; PHP RAM 22% RAM 2M.
Cấu hình mysql của tôi được thực hiện bởi trình hướng dẫn percona .
Mysql nói rằng nếu việc sử dụng CPU của tôi dưới 70% thì vấn đề của tôi là bị ràng buộc bởi đĩa . Cấp, tôi chỉ có một hoạt động của nhà máy WD Caviar 7200 RPM, nhưng tôi sẽ nhận được hơn 19 lần chèn một giây với nó Tôi hy vọng!
Cách đây không lâu tôi đã viết về việc lưu 30.000 nút trong một ngày . Tuy nhiên, để rõ ràng, nút này không liên quan gì đến bất kỳ lực lượng bên ngoài nào. Đây hoàn toàn là một điểm chuẩn để tìm hiểu về cách tăng tốc độ của các cuộc gọi đến node_save ().
Thực tế, tôi cần nhận được 30.000 mục vào cơ sở dữ liệu mỗi phút bằng cách sử dụng node_save. Nếu lưu nút không phải là một tùy chọn, tôi tự hỏi liệu tôi có thể viết hàm api drupal của riêng mình "node_batch_save ()" hay thứ gì đó lợi dụng khả năng của mysql để thực hiện chèn hàng loạt với truy vấn INSERT không . Suy nghĩ về cách tiếp cận này?