Saya akan membuat tabel dengan dua bidang - ID
sebagai BIGINT
dan IPAddress
sebagai varchar(45)
atau varbinary(16)
. Idenya adalah untuk menyimpan semua alamat IP unik dan menggunakan referensi ID
bukan yang sebenarnya IP address
di tabel lain.
Secara umum, saya akan membuat prosedur tersimpan yang mengembalikan yang ID
diberikan IP address
atau (jika alamat tidak ditemukan) masukkan alamat dan kembalikan yang dihasilkan ID
.
Saya berharap memiliki banyak catatan (saya tidak tahu persis berapa banyak), tetapi saya perlu prosedur tersimpan di atas untuk dieksekusi secepat mungkin. Jadi, saya bertanya-tanya bagaimana cara menyimpan alamat IP yang sebenarnya - dalam format teks atau byte. Mana yang lebih baik?
Saya sudah menulis SQL CLR
fungsi untuk mengubah byte alamat IP menjadi string dan sebaliknya, jadi transformasi bukanlah masalah (bekerja dengan keduanya IPv4
dan IPv6
).
Saya kira saya perlu membuat indeks untuk mengoptimalkan pencarian, tetapi saya tidak yakin apakah saya harus memasukkan IP address
bidang ke indeks berkerumun, atau untuk membuat indeks terpisah dan dengan jenis pencarian yang akan lebih cepat?
IPv4
saya kira saya akan mengkonversi alamat INT
dan menggunakan bidang sebagai kunci indeks. Tetapi untuk IPv6
saya perlu menggunakan dua BIGINT
bidang dan saya lebih suka menyimpan nilai dalam satu bidang - bagi saya lebih alami.