Rumah >pembangunan bahagian belakang >Golang >Mengapakah `pangkalan data/sql` dalam Go jauh lebih perlahan daripada pertanyaan PostgreSQL langsung?

Mengapakah `pangkalan data/sql` dalam Go jauh lebih perlahan daripada pertanyaan PostgreSQL langsung?

DDD
DDDasal
2024-11-18 02:52:02809semak imbas

Why is `database/sql` in Go so much slower than direct PostgreSQL queries?

Percanggahan dalam Masa Pelaksanaan Pertanyaan Antara pangkalan data/sql dan Pertanyaan Pangkalan Data Langsung

Dalam aplikasi Go, anda melihat perbezaan masa yang ketara apabila menanyakan pangkalan data PostgreSQL secara langsung melalui psql berbanding menggunakan pakej pangkalan data/sql. Semasa menjalankan pertanyaan yang sama, anda dapati bahawa pangkalan data/sql mengambil masa sekitar 24ms, manakala psql memproses pertanyaan hanya dalam 1ms.

Memahami Perbezaan:

The percanggahan boleh dikaitkan dengan dua faktor utama:

1. Penciptaan dan Pengurusan Sambungan Pangkalan Data:

  • psql: Apabila anda melaksanakan pertanyaan secara terus menggunakan psql, ia mewujudkan satu sambungan aktif ke pangkalan data, yang kekal terbuka untuk tempoh sesi anda.
  • pangkalan data/sql: Sebaliknya, pangkalan data/sql menggunakan kolam sambungan, yang menguruskan berbilang sambungan ke pangkalan data. Pada mulanya, tiada sambungan aktif dalam kolam. Apabila pertanyaan dilaksanakan menggunakan pangkalan data/sql, kumpulan itu mewujudkan sambungan baharu.

2. Perlaksanaan Penyata Disediakan:

  • psql: Apabila anda menjalankan pertanyaan melalui psql, ia biasanya "pertanyaan ringkas" tanpa sebarang parameter.
  • pangkalan data/sql: Secara lalai, pangkalan data/sql menggunakan pernyataan yang disediakan. Walaupun pertanyaan anda tidak mempunyai sebarang parameter, penggunaan $1 dalam pertanyaan menyebabkan pangkalan data/sql mencipta dan melaksanakan pernyataan yang disediakan.

Mengoptimumkan Prestasi Pertanyaan:

Untuk meminimumkan perbezaan masa, pertimbangkan pengoptimuman berikut:

1. Mulakan Kolam Sambungan:

  • Gunakan kaedah db.Ping() serta-merta selepas memulakan sambungan pangkalan data/sql untuk memastikan sekurang-kurangnya satu sambungan dibuka dalam kolam. Ini mengurangkan kependaman penubuhan sambungan awal.

2. Lepaskan Sambungan:

  • Selepas melaksanakan pertanyaan menggunakan db.Query, panggil kaedah rows.Close() untuk melepaskan sambungan semula ke dalam kolam. Kegagalan berbuat demikian memastikan sambungan tetap terbuka, yang membawa kepada potensi kebocoran sumber.

3. Gunakan Pertanyaan Ringkas apabila Mungkin:

  • Jika pertanyaan anda tidak memerlukan parameterisasi, nyatakan ia sebagai rentetan terus dalam db.Query. Ini mengelakkan overhed untuk mencipta dan melaksanakan penyata yang disediakan.

Dengan melaksanakan pengoptimuman ini, anda harus mengurangkan dengan ketara masa pelaksanaan pertanyaan menggunakan pangkalan data/sql dan membawanya lebih dekat kepada prestasi pertanyaan pangkalan data langsung.

Atas ialah kandungan terperinci Mengapakah `pangkalan data/sql` dalam Go jauh lebih perlahan daripada pertanyaan PostgreSQL langsung?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn