Artikel ini menunjukkan cara untuk mengenal pasti alamat IP yang ada dengan cekap dalam jadual login_log
tetapi tiada daripada jadual ip_location
dalam pangkalan data PostgreSQL. Beberapa pendekatan dibentangkan, masing-masing mempunyai kekuatan dan kelemahan tersendiri.
Mengenal pasti Alamat IP yang Hilang
Masalah utama melibatkan mencari percanggahan antara dua jadual: login_log
(mengandungi percubaan log masuk dengan alamat IP) dan ip_location
(mengandungi set alamat IP yang diketahui). Matlamatnya adalah untuk mengekstrak alamat IP yang dilog masuk login_log
yang tidak direkodkan dalam ip_location
.
Kaedah Pertanyaan Optimum
Beberapa teknik SQL boleh mencapai ini; berikut adalah yang paling cekap dan biasa digunakan:
1. NOT EXISTS
Subquery: Secara amnya kaedah terpantas dalam PostgreSQL.
<code class="language-sql">SELECT ip FROM login_log l WHERE NOT EXISTS ( SELECT 1 -- SELECT list is irrelevant, 1 is efficient FROM ip_location i WHERE i.ip = l.ip );</code>
Pertanyaan ini dengan cekap menyemak sama ada IP yang sepadan wujud dalam ip_location
untuk setiap IP dalam login_log
. SELECT 1
dalam subkueri mengoptimumkan prestasi.
2. LEFT JOIN
dengan IS NULL
: Alternatif yang ringkas dan selalunya pantas.
<code class="language-sql">SELECT l.ip FROM login_log l LEFT JOIN ip_location i USING (ip) -- Equivalent to ON i.ip = l.ip WHERE i.ip IS NULL;</code>
Ini melakukan gabungan kiri, mengekalkan semua baris daripada login_log
. Alamat IP yang tiada daripada ip_location
akan mempunyai NULL
dalam lajur i.ip
, yang kemudiannya ditapis oleh klausa WHERE
.
3. EXCEPT ALL
: Kaedah padat, tetapi berkemungkinan kurang cekap untuk pertanyaan rumit.
<code class="language-sql">SELECT ip FROM login_log EXCEPT ALL -- "ALL" preserves duplicates, potentially faster SELECT ip FROM ip_location;</code>
Operasi set ini secara langsung mencari perbezaan antara dua set alamat IP. EXCEPT ALL
adalah lebih baik kerana ia lebih pantas dan mengendalikan IP pendua.
4. NOT IN
(Gunakan dengan Berhati-hati): Walaupun berfungsi, NOT IN
boleh menjadi perlahan, terutamanya dengan set data yang besar. Ia biasanya kurang cekap daripada kaedah sebelumnya.
<code class="language-sql">SELECT ip FROM login_log WHERE ip NOT IN ( SELECT DISTINCT ip -- DISTINCT is optional but can improve performance slightly FROM ip_location );</code>
Pendekatan ini secara langsung menyemak sama ada IP tidak hadir dalam senarai IP daripada ip_location
. Walau bagaimanapun, prestasi boleh merosot dengan ketara dengan set data yang lebih besar.
Bacaan Selanjutnya:
Untuk menyelami lebih mendalam tentang teknik ini dan strategi pengoptimuman PostgreSQL yang berkaitan, rujuk sumber ini:
Atas ialah kandungan terperinci Bagaimana untuk Cari Alamat IP dalam Satu Jadual yang Hilang dalam Jadual Lain dalam PostgreSQL?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!