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

tuyên bố chuẩn bị của trình điều khiển golang sql

Sự khác biệt có thể nhỏ, đôi khi quan trọng và đôi khi không tồn tại.

Nói chung, một câu lệnh chuẩn bị 1. được chuẩn bị với máy chủ (SQL được phân tích cú pháp, kế hoạch thực thi được tạo, v.v.), 2. được thực thi với các tham số bổ sung, và sau đó 3. được đóng lại. Nó cho phép bạn sử dụng lại cùng một SQL với các tham số khác nhau được truyền vào mỗi lần, nó có thể giúp bảo vệ khỏi việc đưa vào SQL, có thể cung cấp một số cải tiến về hiệu suất (cụ thể cho trình điều khiển / giao thức, YMMV) và ngăn các bước lặp lại, như trong tạo kế hoạch thực thi và phân tích cú pháp SQL trong the chuẩn bị bước trên.

Đối với người viết mã nguồn, một câu lệnh chuẩn bị có thể thuận tiện hơn việc nối các chuỗi và gửi chúng đến máy chủ DB.

DB.Query() phương thức nhận SQL dưới dạng một chuỗi và không hoặc nhiều đối số (Exec() cũng vậy hoặc QueryRow() ). Một chuỗi SQL không có đối số bổ sung sẽ truy vấn chính xác những gì bạn đã viết. Tuy nhiên, với điều kiện là một chuỗi SQL có trình giữ chỗ và các đối số bổ sung, một câu lệnh chuẩn bị sẽ được thực hiện cho bạn.

DB.Prepare() phương thức thực hiện một cách rõ ràng một câu lệnh đã chuẩn bị sẵn, sau đó bạn chuyển các đối số vào, như trong:stmt.Exec(...args) .

Có một số điều đáng suy nghĩ về sự khác biệt giữa hai điều này và lý do tại sao nên sử dụng cái này hay cái kia.

Bạn có thể sử dụng DB.Query() mà không cần đối số. Điều này có thể rất hiệu quả vì nó có thể bỏ qua chuẩn bị -> thực thi -> đóng trình tự mà câu lệnh đã chuẩn bị nhất thiết phải trải qua.

Bạn cũng có thể sử dụng nó với các đối số bổ sung và trình giữ chỗ trong chuỗi truy vấn, và nó sẽ thực thi một câu lệnh đã chuẩn bị sẵn dưới các bìa như tôi đã đề cập ở trên. Vấn đề tiềm ẩn ở đây là khi bạn thực hiện một số truy vấn, mỗi truy vấn sẽ dẫn đến một câu lệnh được chuẩn bị kỹ lưỡng. Vì có thêm các bước liên quan nên việc này có thể không hiệu quả vì nó chuẩn bị lại, thực thi và đóng mỗi khi bạn thực hiện truy vấn đó.

Với một tuyên bố được chuẩn bị rõ ràng, bạn có thể tránh được sự kém hiệu quả đó vì bạn đang cố gắng sử dụng lại SQL mà bạn đã chuẩn bị trước đó, với các đối số tiềm ẩn khác nhau.

Nhưng điều đó không phải lúc nào cũng diễn ra như bạn mong đợi ... Do nhóm kết nối cơ bản được quản lý bởi db / sql, "kết nối cơ sở dữ liệu" của bạn khá ảo. DB.Prepare() phương thức sẽ chuẩn bị câu lệnh dựa trên một kết nối cụ thể và sau đó cố gắng khôi phục lại chính kết nối đó khi đến lúc thực thi, nhưng nếu kết nối đó không khả dụng, nó sẽ chỉ lấy một kết nối có sẵn và chuẩn bị lại và thực thi với kết nối đó. Nếu bạn đang sử dụng lặp đi lặp lại cùng một tuyên bố đã chuẩn bị sẵn đó thì bạn có thể vô tình chuẩn bị lại nó nhiều lần. Điều này rõ ràng chủ yếu được đưa ra ánh sáng khi bạn đang đối phó với giao thông đông đúc.

Vì vậy, rõ ràng việc bạn sử dụng cho trường hợp nào tùy thuộc vào trường hợp sử dụng cụ thể của bạn, nhưng tôi hy vọng các chi tiết ở trên giúp làm rõ cho bạn đủ để bạn có thể đưa ra quyết định tốt nhất trong từng trường hợp.

Cập nhật

Với bản cập nhật trong OP về cơ bản không có sự khác biệt khi truy vấn chỉ cần được thực hiện một lần, vì các truy vấn có đối số được thực hiện dưới dạng các câu lệnh đã chuẩn bị sẵn.

Sử dụng các phương pháp trực tiếp, ví dụ:DB.Query() và các tương tự của nó, so với việc sử dụng các câu lệnh đã chuẩn bị một cách rõ ràng, vì nó sẽ dẫn đến mã nguồn đơn giản hơn một chút.

Trong trường hợp này, các tuyên bố đã chuẩn bị sẵn đang được sử dụng vì lý do bảo mật, nên có thể đáng để nỗ lực xử lý các vấn đề bảo mật bằng các phương tiện khác và thay vào đó sử dụng các truy vấn bản rõ vì nó sẽ cải thiện hiệu suất. Tuy nhiên, bất kỳ lợi ích nào có thể không liên quan trừ khi có đủ lưu lượng truy cập (hoặc lưu lượng được dự đoán sẽ tăng lên đáng kể trong tương lai) để yêu cầu giảm tải trên máy chủ. Một lần nữa, nó lại liên quan đến trường hợp sử dụng trong thế giới thực.

Đối với bất kỳ ai quan tâm đến một số chỉ số về sự khác biệt giữa câu lệnh chuẩn bị và truy vấn văn bản rõ trực tiếp, có một bài viết hay tại đây (cũng làm rất tốt việc giải thích nhiều điều ở trên).



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Nhập CSV vào MySQL với định dạng ngày tháng khác nhau

  2. Cách tìm kiếm giá trị được phân tách bằng dấu phẩy

  3. Sử dụng SQL JOIN và COUNT

  4. Câu lệnh MYSQL IN

  5. Không thể truy xuất siêu dữ liệu