Saya mengembangkan aplikasi di Ruby on Rails dengan database PostgreSQL (9.4). Untuk kasus penggunaan saya, kolom dalam tabel akan terlihat sangat sering, karena seluruh titik aplikasi mencari atribut yang sangat spesifik pada model.
Saat ini saya memutuskan apakah akan menggunakan integer
tipe atau hanya menggunakan tipe string yang khas (misalnya character varying(255)
, yang merupakan default di Rails ) untuk kolom, karena saya tidak yakin apa perbedaan kinerja pada indeks.
Kolom-kolom ini adalah enum . Mereka memiliki ukuran tetap untuk jumlah nilai yang mungkin mereka miliki. Kebanyakan panjang enum tidak melebihi 5, artinya indeks akan lebih atau kurang tetap sepanjang masa aplikasi ; dengan demikian, indeks integer dan string akan identik dalam jumlah node.
Namun, string yang akan diindeks bisa sekitar 20 karakter, yang dalam memori kira-kira 5x dari integer (jika integer adalah 4 byte, dan string ASCII murni pada 1 byte per karakter, maka ini berlaku). Saya tidak tahu bagaimana mesin database melakukan pencarian indeks, tetapi jika perlu "memindai" string sampai sama persis , maka pada dasarnya itu berarti bahwa pencarian string akan 5x lebih lambat daripada pencarian integer; "pindai" sampai cocok untuk pencarian bilangan bulat akan menjadi 4 byte, bukan 20. Inilah yang saya bayangkan:
Nilai pencarian adalah (bilangan bulat) 4:
memindai ............................ DITEMUKAN | mendapatkan catatan ... | BYTE_1 | BYTE_2 | BYTE_3 | BYTE_4 | BYTE_5 | BYTE_6 | BYTE_7 | BYTE_8 | ... |
Nilai pencarian adalah (string) "some_val" (8 bytes):
memindai ................................................. .................................... DITEMUKAN | mendapatkan catatan ... | BYTE_1 | BYTE_2 | BYTE_3 | BYTE_4 | BYTE_5 | BYTE_6 | BYTE_7 | BYTE_8 | ... |
Saya harap itu masuk akal. Pada dasarnya, karena integer mengambil lebih sedikit ruang, ia dapat "dicocokkan" lebih cepat daripada rekan senarnya. Mungkin ini tebakan yang sepenuhnya salah, tapi aku bukan ahli, jadi itu sebabnya aku bertanya pada kalian! Saya kira jawaban yang baru saya temukan ini sepertinya mendukung hipotesis saya, tetapi saya ingin memastikan.
Jumlah nilai yang mungkin di kolom tidak akan berubah dalam menggunakan salah satu, jadi indeks itu sendiri tidak akan berubah (kecuali saya menambahkan nilai baru ke enum). Dalam hal ini, apakah akan ada perbedaan kinerja dalam menggunakan integer
atau varchar(255)
, atau apakah menggunakan tipe integer lebih masuk akal?
Alasan saya bertanya adalah bahwa enum
tipe peta Rails bilangan bulat ke kunci string, tetapi mereka tidak dimaksudkan untuk menjadi kolom yang menghadap pengguna. Pada dasarnya, Anda tidak dapat melakukan verifikasi bahwa nilai enum adalah valid, karena nilai yang tidak valid akan menyebabkan ArgumentError
sebelum validasi apa pun dapat dijalankan. Menggunakan string
tipe akan memungkinkan validasi, tetapi jika ada biaya kinerja saya lebih suka hanya meretas masalah validasi.
varchar(255)
vs. misalnyavarchar(260)
. Mungkin ada hal seperti itu dengan SQL Server 6.x tetapi ini tidak benar untuk waktu yang lama.