Bila menggunakan SQL, apakah ada manfaat menggunakan =
dalam WHERE
klausul bukan LIKE
?
Tanpa operator khusus, LIKE
dan =
apakah sama, kan?
sql
performance
equals
sql-like
Travis
sumber
sumber
5
suara untuk tag seperti operator . Bisakah saya meminta Anda menyarankan seperti sql sebagai sinonim ?Jawaban:
Operator yang berbeda
LIKE
dan=
merupakan operator yang berbeda. Sebagian besar jawaban di sini fokus pada dukungan wildcard, yang bukan satu-satunya perbedaan antara operator-operator ini!=
adalah operator perbandingan yang beroperasi pada angka dan string. Saat membandingkan string, operator perbandingan membandingkan seluruh string .LIKE
adalah operator string yang membandingkan karakter dengan karakter .Untuk memperumit masalah, kedua operator menggunakan collation yang dapat memiliki efek penting pada hasil perbandingan.
Contoh Memotivasi
Mari kita pertama-tama mengidentifikasi contoh di mana operator ini menghasilkan hasil yang jelas berbeda. Izinkan saya mengutip dari manual MySQL:
Harap dicatat bahwa halaman manual MySQL ini disebut String Comparison Functions , dan
=
tidak dibahas, yang menyiratkan hal itu=
ini bukan semata-mata fungsi perbandingan string.Bagaimana cara
=
kerjanya?The SQL Standard § 8.2 menggambarkan bagaimana
=
membandingkan string:(Penekanan ditambahkan.)
Apa artinya ini? Ini berarti bahwa ketika membandingkan string,
=
operator hanyalah pembungkus tipis di sekitar susunan saat ini. Kolasi adalah perpustakaan yang memiliki berbagai aturan untuk membandingkan string. Berikut adalah contoh pengumpulan biner dari MySQL :Susunan khusus ini terjadi untuk membandingkan byte-by-byte (itulah sebabnya ini disebut "biner" - tidak memberikan makna khusus pada string). Koleksi lainnya dapat memberikan perbandingan yang lebih maju.
Misalnya, berikut ini adalah susunan UTF-8 yang mendukung perbandingan case-insensitive. Kode ini terlalu panjang untuk ditempelkan di sini, tetapi buka tautan itu dan baca isi
my_strnncollsp_utf8mb4()
. Susunan ini dapat memproses beberapa byte sekaligus dan dapat menerapkan berbagai transformasi (seperti perbandingan tidak sensitif huruf). Itu=
operator benar-benar disarikan dari keanehan pemeriksaan tersebut.Bagaimana
LIKE
kerjanya?The SQL Standard § 8,5 menjelaskan bagaimana
LIKE
membandingkan string:(Penekanan ditambahkan.)
Ini cukup bertele-tele, jadi mari kita jabarkan. Item ii dan iii merujuk ke wildcard
_
dan%
, masing-masing. JikaP
tidak mengandung wildcard, maka hanya item iv yang berlaku. Ini adalah kasus bunga yang ditimbulkan oleh OP.Dalam hal ini, ia membandingkan setiap "substring" (karakter individu)
M
terhadap setiap substring dalamP
menggunakan susunan saat ini.Kesimpulan
Intinya adalah ketika membandingkan string,
=
membandingkan seluruh string sambilLIKE
membandingkan satu karakter pada suatu waktu. Kedua perbandingan menggunakan susunan saat ini. Perbedaan ini menyebabkan hasil yang berbeda dalam beberapa kasus, sebagaimana dibuktikan dalam contoh pertama dalam posting ini.Yang mana yang harus Anda gunakan? Tidak ada yang bisa memberi tahu Anda - Anda perlu menggunakan yang benar untuk use case Anda. Jangan mengoptimalkan secara prematur dengan mengganti operator perbandingan.
sumber
LIKE
dilakukan, tetapi jawaban ini dengan luar biasa menjelaskan bahwa menggunakanLIKE
tanpa%
atau_
hadir sama sekali tidak sama dengan menggunakan=
. Semoga jawaban Anda menerima seribu upvotes.'AbCdEfG'
, dan saya lakukanWHERE MyCol = 'abcdefg'
, saya masih mendapatkan baris itu kembali, meskipun mereka jelas tidak setara byte-by-byteset charset latin1;
SELECT 'ä' = 'ae' COLLATE latin1_german2_ci;
memberi 0, danSELECT 'ä' LIKE 'ae' COLLATE latin1_german2_ci;
memberi 0 juga.Operator equals (=) adalah "operator perbandingan membandingkan dua nilai untuk kesetaraan." Dengan kata lain, dalam pernyataan SQL, itu tidak akan kembali benar kecuali kedua sisi persamaan sama. Sebagai contoh:
Operator LIKE "mengimplementasikan perbandingan kecocokan pola" yang mencoba untuk mencocokkan "nilai string terhadap string pola yang berisi karakter wild-card." Sebagai contoh:
LIKE umumnya hanya digunakan dengan string dan equals (saya percaya) lebih cepat. Operator yang sama memperlakukan karakter wild card sebagai karakter literal. Perbedaan dalam hasil yang dikembalikan adalah sebagai berikut:
Dan
Akan mengembalikan hasil yang sama, meskipun menggunakan LIKE umumnya akan lebih lama karena kecocokan polanya. Namun,
Dan
Akan mengembalikan hasil yang berbeda, di mana menggunakan "=" menghasilkan hanya hasil dengan "Chris%" dikembalikan dan operator LIKE akan mengembalikan apa pun yang dimulai dengan "Chris".
Semoga itu bisa membantu. Beberapa info bagus dapat ditemukan di sini .
sumber
Ini adalah salinan / rekatkan jawaban saya yang lain untuk pertanyaan kinerja SQL 'like' vs '=' :
Contoh pribadi menggunakan mysql 5.5: Saya memiliki gabungan dalam antara 2 tabel, satu dari 3 juta baris dan satu dari 10 ribu baris.
Saat menggunakan sejenis pada indeks seperti di bawah ini (tidak ada wildcard), butuh sekitar 30 detik:
menggunakan 'jelaskan' saya dapatkan:
Saat menggunakan '=' pada permintaan yang sama, butuh sekitar 0,1 detik:
Menggunakan 'jelaskan' saya dapatkan:
Seperti yang Anda lihat,
like
pencarian indeks yang dibatalkan sepenuhnya, jadi kueri membutuhkan waktu 300 kali lebih banyak.sumber
LIKE
dan=
berbeda.LIKE
adalah apa yang akan Anda gunakan dalam permintaan pencarian. Ini juga memungkinkan wildcard seperti_
(karakter wildcard sederhana) dan%
(wildcard multi-karakter).=
harus digunakan jika Anda ingin kecocokan yang tepat dan itu akan lebih cepat.Situs ini menjelaskan
LIKE
sumber
Satu perbedaan - terlepas dari kemungkinan untuk menggunakan wildcard dengan LIKE - ada di spasi tambahan: Operator = mengabaikan spasi tambahan, tetapi LIKE tidak.
sumber
Tergantung pada sistem basis data.
Umumnya tanpa karakter khusus, ya, = dan LIKE sama.
Namun, beberapa sistem database mungkin memperlakukan pengaturan collation secara berbeda dengan operator yang berbeda.
Sebagai contoh, dalam perbandingan MySQL dengan = pada string selalu case-insensitive secara default, jadi LIKE tanpa karakter khusus adalah sama. Pada beberapa LIKE RDBMS lainnya adalah case-insensitive sementara = tidak.
sumber
Untuk contoh ini kita anggap remeh bahwa varcharcol tidak mengandung
''
dan tidak memiliki sel kosong di kolom iniYang pertama menghasilkan 0 baris output sedangkan yang kedua menunjukkan seluruh daftar. = adalah kasus yang benar-benar cocok sementara suka bertindak seperti filter. jika filter tidak memiliki kriteria, setiap data valid.
suka - berdasarkan fungsinya bekerja sedikit lebih lambat dan dimaksudkan untuk digunakan dengan varchar dan data serupa.
sumber
Jika Anda mencari yang sama persis, Anda bisa menggunakan keduanya, = dan LIKE.
Menggunakan "=" sedikit lebih cepat dalam hal ini (mencari kecocokan yang tepat) - Anda dapat memeriksanya sendiri dengan memiliki kueri yang sama dua kali dalam SQL Server Management Studio, sekali menggunakan "=", sekali menggunakan "LIKE", dan lalu gunakan "Permintaan" / "Sertakan rencana eksekusi aktual".
Jalankan dua pertanyaan dan Anda akan melihat hasil Anda dua kali, ditambah dua rencana eksekusi yang sebenarnya. Dalam kasus saya, mereka dibagi 50% vs 50%, tetapi "=" rencana eksekusi memiliki "perkiraan biaya subtree" yang lebih kecil (ditampilkan ketika Anda mengarahkan kursor ke kotak "SELECT" paling kiri) - tetapi sekali lagi, itu benar-benar bukan perbedaan besar.
Tetapi ketika Anda mulai mencari dengan wildcard dalam ekspresi LIKE Anda, kinerja pencarian akan meredup. Cari "LIKE Mill%" masih bisa cukup cepat - SQL Server dapat menggunakan indeks pada kolom itu, jika ada. Mencari "LIKE% ekspresi%" sangat lambat, karena satu-satunya cara SQL Server dapat memuaskan pencarian ini adalah dengan melakukan pemindaian tabel penuh. Jadi berhati-hatilah dengan LIKE Anda!
Marc
sumber
Menggunakan = menghindari wildcard dan konflik karakter khusus dalam string ketika Anda membangun kueri saat run time.
Ini membuat hidup programmer lebih mudah dengan tidak harus melarikan diri dari semua karakter wildcard khusus yang mungkin tergelincir dalam klausa LIKE dan tidak menghasilkan hasil yang diinginkan. Lagipula, = adalah skenario use case 99%, akan sulit untuk melarikan diri setiap saat.
memutar mata pada '90 -an
Saya juga menduga itu sedikit lebih lambat, tapi saya ragu itu penting jika tidak ada wildcard dalam polanya.
sumber
Untuk menjawab pertanyaan awal tentang kinerja, ia turun ke pemanfaatan indeks . Ketika pemindaian tabel sederhana terjadi, "LIKE" dan "=" identik . Ketika indeks terlibat, itu tergantung pada bagaimana klausa LIKE terbentuk. Lebih khusus lagi, apa lokasi wildcard (s)?
Pertimbangkan yang berikut ini:
Mungkin juga ada perbedaan yang dapat diabaikan dalam pembuatan rencana kueri saat menggunakan "=" vs "LIKE".
sumber
Selain wildcard, perbedaan antara
=
ANDLIKE
akan bergantung pada jenis SQL server dan pada tipe kolom.Ambil contoh ini:
Menggunakan MS SQL Server 2012 , spasi tambahan akan diabaikan dalam perbandingan, kecuali dengan
LIKE
saat tipe kolomVARCHAR
.Menggunakan MySQL 5.5 , spasi tambahan akan diabaikan
=
, tetapi tidak untukLIKE
, baik denganCHAR
danVARCHAR
.Menggunakan PostgreSQL 9.1 , spasi signifikan dengan keduanya
=
danLIKE
menggunakanVARCHAR
, tetapi tidak denganCHAR
(lihat dokumentasi ).Perilaku dengan
LIKE
juga berbeda denganCHAR
.Menggunakan data yang sama seperti di atas, menggunakan eksplisit
CAST
pada nama kolom juga membuat perbedaan :Ini hanya mengembalikan baris untuk "CAST baik" dan "CAST col".
sumber
Kata kunci LIKE tidak diragukan lagi dilengkapi dengan "label harga kinerja" yang terlampir. Yang mengatakan, jika Anda memiliki bidang input yang berpotensi memasukkan karakter wild card untuk digunakan dalam permintaan Anda, saya akan merekomendasikan menggunakan LIKE hanya jika input berisi salah satu wild card. Kalau tidak, gunakan standar yang sama dengan perbandingan.
Salam Hormat...
sumber
Benar-benar turun ke apa yang Anda ingin lakukan query. Jika Anda bermaksud pasangan yang tepat maka gunakan =. Jika Anda bermaksud pertandingan fuzzier, maka gunakan LIKE. Mengatakan maksud Anda biasanya merupakan kebijakan yang baik dengan kode.
sumber
Di Oracle, 'suka' tanpa wildcard akan mengembalikan hasil yang sama dengan 'sama', tetapi bisa memerlukan pemrosesan tambahan. Menurut Tom Kyte , Oracle akan memperlakukan 'like' tanpa wildcard sebagai 'equals' saat menggunakan literal, tetapi tidak ketika menggunakan variabel bind.
sumber
=
danLIKE
tidak sama;=
cocok dengan string yang tepatLIKE
cocok dengan string yang mungkin berisi wildcard (%)sumber