Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Bất ngờ đạt đến giới hạn bộ nhớ PHP chỉ với một truy vấn PDO?

Ding ding ding!

Khi kết nối với MySQL, PHP thích sử dụng truy vấn có đệm . Điều này đúng bất kể phương pháp bạn đang sử dụng để kết nối. Khi sử dụng truy vấn có bộ đệm, toàn bộ tập kết quả được tìm nạp ngay lập tức thay vì được tìm nạp khi bạn yêu cầu. Đây là thường tốt cho hiệu suất, vì có ít chuyến đi khứ hồi hơn.

Nhưng giống như mọi thứ trong PHP, có một gotcha. Như đã lưu ý trên trang đệm:

Bạn đang sử dụng PHP 5.3, có nghĩa là có nhiều khả năng bạn đang sử dụng mysqlnd.

Bạn sẽ muốn tắt các truy vấn có bộ đệm tại đây. Nó được thực hiện khác nhau trong mọi giao diện PHP với MySQL:

  • Đối với PDO, bạn sẽ cần đặt PDO::MYSQL_ATTR_USE_BUFFERED_QUERY thuộc tính false .
  • Đối với mysqli, bạn cần chuyển MYSQLI_USE_RESULT đối với query phương pháp.
  • Đối với mysql, bạn cần gọi mysql_unbuffered_query thay vì mysql_query .

Chi tiết và ví dụ đầy đủ có trên trang.

Đã nhận được truy vấn không có bộ đệm lớn!

Bạn phải đóng đúng cách xử lý câu lệnh và giải phóng tập hợp kết quả trước khi đưa ra một truy vấn khác:

  • Trong PDO, điều này có nghĩa là gọi closeCursor trên bảng điều khiển câu lệnh.
  • Trong mysqli, điều này có nghĩa là gọi free_result trên xử lý câu lệnh hoặc free trên tay cầm kết quả, tùy thuộc vào những gì bạn đang làm việc với.
  • Trong mysql, điều này có nghĩa là gọi mysql_free_result

Nếu không làm điều này sẽ dẫn đến lỗi.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Kết xuất tất cả các bảng ở định dạng CSV bằng cách sử dụng 'mysqldump'

  2. Cảnh báo:mysql_connect ():Quyền truy cập bị từ chối đối với người dùng 'root' @ 'localhost' (sử dụng mật khẩu:CÓ)

  3. Chèn &tham gia MySQL

  4. MySQL cách tốt nhất để lưu trữ các chuỗi dài

  5. Cách tốt hơn để chọn tất cả các cột từ bảng đầu tiên và chỉ một cột từ bảng thứ hai khi tham gia bên trong