Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Instrukcja przygotowania sterownika golang sql

Różnice mogą być subtelne, czasami ważne, a czasami skutecznie nieistniejące.

Na ogół przygotowana instrukcja 1. jest przygotowywana z serwerem (przeanalizowana SQL, wygenerowany plan wykonania itp.), 2. jest wykonywana z dodatkowymi parametrami, a następnie 3. jest zamykana. Pozwala na ponowne użycie tego samego SQL z różnymi parametrami przekazywanymi za każdym razem, może pomóc w ochronie przed wstrzyknięciem SQL, może zapewnić pewne ulepszenia wydajności (specyficzne dla sterownika/protokołu, YMMV) i zapobiec powtarzaniu kroków, jak w generowaniu planu wykonania i parsowaniu SQL w przygotuj krok powyżej.

Dla kogoś, kto pisze kod źródłowy, przygotowana instrukcja może być wygodniejsza niż łączenie ciągów i wysyłanie ich do serwera DB.

DB.Query() Metoda przyjmuje SQL jako ciąg i zero lub więcej argumentów (tak jak robi Exec() lub QueryRow() ). Ciąg SQL bez dodatkowych argumentów spowoduje zapytanie dokładnie o to, co napisałeś. Jednak pod warunkiem dostarczenia ciągu SQL z symbolami zastępczymi i dodatkowymi argumentami, przygotowana instrukcja jest przygotowywana pod maską.

DB.Prepare() metoda jawnie wykonuje przygotowaną instrukcję, do której następnie przekazujesz argumenty, na przykład:stmt.Exec(...args) .

Jest kilka rzeczy, o których warto pomyśleć, jeśli chodzi o różnice między nimi i dlaczego warto korzystać z jednej lub drugiej.

Możesz użyć DB.Query() bez argumentów. Może to być bardzo wydajne, ponieważ może ominąć przygotuj --> wykonaj --> zamknij kolejność, przez którą musi przejść przygotowana instrukcja.

Możesz również użyć go z dodatkowymi argumentami i symbolami zastępczymi w ciągu zapytania, a wykona przygotowaną instrukcję pod okładkami, jak wspomniałem powyżej. Potencjalny problem polega na tym, że gdy wykonujesz wiele zapytań, każde z nich daje w wyniku przygotowane pod maską oświadczenie. Ponieważ wiąże się to z dodatkowymi krokami, może to być raczej nieefektywne, ponieważ ponownie przygotowuje się, wykonuje i zamyka za każdym razem, gdy wykonujesz to zapytanie.

Dzięki wyraźnej, przygotowanej instrukcji możesz prawdopodobnie uniknąć tej nieefektywności, gdy próbujesz ponownie użyć przygotowanego wcześniej SQL, z potencjalnie różnymi argumentami.

Ale to nie zawsze działa tak, jak można by się spodziewać... Ze względu na podstawową pulę połączeń zarządzaną przez db/sql, twoje "połączenie z bazą danych" jest dość wirtualne. DB.Prepare() Metoda przygotuje instrukcję dla konkretnego połączenia, a następnie spróbuje odzyskać to samo połączenie, gdy nadejdzie czas na wykonanie, ale jeśli to połączenie jest niedostępne, po prostu pobierze to, które jest dostępne, i ponownie przygotuje się i wykona na nim. Jeśli używasz tego samego przygotowanego oświadczenia w kółko, możesz, nieświadomie, także przygotowywać go w kółko. To oczywiście wychodzi na jaw, gdy masz do czynienia z dużym ruchem.

Więc oczywiście to, w jakich okolicznościach używasz, zależy od konkretnego przypadku użycia, ale mam nadzieję, że powyższe szczegóły pomogą ci wyjaśnić na tyle, że możesz podjąć najlepszą decyzję w każdym przypadku.

Aktualizacja

Biorąc pod uwagę aktualizację w OP, zasadniczo nie ma różnicy, kiedy zapytanie musi zostać wykonane tylko raz, ponieważ zapytania z argumentami są wykonywane jako przygotowane instrukcje zakulisowe.

Skorzystaj z metod bezpośrednich, np. DB.Query() i jego odpowiedniki, w przeciwieństwie do jawnego używania przygotowanych instrukcji, ponieważ spowoduje to nieco prostszy kod źródłowy.

Ponieważ w tym przypadku przygotowane oświadczenia są wykorzystywane ze względów bezpieczeństwa, warto zająć się kwestiami bezpieczeństwa innymi sposobami i zamiast tego użyć zapytań w postaci zwykłego tekstu, ponieważ poprawi to wydajność. Wszelkie zyski mogą być jednak nieistotne, chyba że ruch jest wystarczający (lub przewiduje się znaczny wzrost ruchu w przyszłości), aby wymuszać zmniejszenie obciążenia serwera. Ponownie sprowadza się to do rzeczywistego przypadku użycia.

Dla każdego, kto jest zainteresowany niektórymi metrykami różnicy między przygotowanymi instrukcjami a bezpośrednimi zapytaniami w postaci zwykłego tekstu, polecamy dobry artykuł tutaj (co również doskonale wyjaśnia wiele z powyższych).



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Czy MySQL jest bardziej odporny na atak SQL injection niż PostgreSQL (pod Perl/DBI)?

  2. Pobieranie znaków specjalnych z bazy danych MySQL za pomocą PHP

  3. RAW SQL Query z Zend Framework

  4. Jak pobrać dane JSON z MySQL?

  5. Docker Machine na Macu:Nie widzisz zamontowanych woluminów na hoście dockera/docker-machine? Gdzie są fizycznie przechowywane woluminy?