2009-02-18 15 views
28

pierwsze, uznaję różnice między tymi dwoma:
- Like udostępni symboli wieloznacznych% i _
- znaczna końcowe spacje
- colation wydajeKorzystanie LIKE = porównaniu do dokładnego dopasowania ciąg

Wszystko inne rzeczy są równe, dla dokładnego dopasowania ciąg, który jest bardziej wydajny:

SELECT field WHERE 'a' = 'a'; 

czyli

SELECT field WHERE 'a' LIKE 'a'; 

Lub: Czy różnica jest tak nieznaczna, że ​​nie ma znaczenia?

+4

odsłaniając zupełnie braindead Wdrożenie, koszt smaku porównywania łańcuchów będzie obniżony o koszt przeniesienia danych z dysku. Napisz, co naprawdę masz na myśli i zajmij się programowaniem. –

+2

To zostało wcześniej omówione [tutaj] (http://stackoverflow.com/questions/543580/equals-vs-like) na stackoverflow. Mam nadzieję, że to pomoże. – user34867

+0

Dzięki, szukałem tego przed wysłaniem, ale nie widziałem tego w jakiś sposób. – mluebke

Odpowiedz

29

Powiedziałbym, że = komparator byłby szybszy. Leksyk nie przesyła porównania do innego systemu leksykalnego do ogólnych dopasowań. Zamiast tego silnik może po prostu dopasować się lub ruszyć dalej. Nasz db w pracy ma miliony wierszy, a an = jest zawsze szybszy.

3

W przyzwoitym systemie DBMS silnik bazy danych rozpoznałby, że nie ma znaków wieloznacznych w łańcuchu i niejawnie przekształcił go w czystą równość (niekoniecznie taki sam jak =). Tak więc na początku uzyskasz tylko małe trafienie wydajnościowe, zazwyczaj pomijalne w przypadku każdego przyzwoitego zapytania.

Jednak operator MySQL = niekoniecznie zachowuje się tak, jak tego oczekujesz (jako czysta kontrola równości). W szczególności, nie domyślnie uwzględnia spacje dla CHAR i VARCHAR danych, co oznacza, że:

SELECT age WHERE name = 'pax' 

daje wiersze dla 'pax', 'pax<one space>'i'pax<a hundred spaces>'.

Jeśli chcesz zrobić właściwą kontrolę równości, należy użyć binary kluczowe:

SELECT field WHERE name = binary 'pax' 

można przetestować to z czymś takim:

mysql> create table people (name varchar(10)); 

mysql> insert into people value ('pax'); 
mysql> insert into people value ('pax '); 
mysql> insert into people value ('pax '); 
mysql> insert into people value ('pax '); 
mysql> insert into people value ('notpax'); 

mysql> select count(*) from people where name like 'pax'; 
1 

mysql> select count(*) from people where name = 'pax'; 
4 

mysql> select count(*) from people where name = binary 'pax'; 
1 
+0

Dobra aktualizacja, ale o większym znaczeniu dla tego pytania, "LIKE" wykonuje dopasowanie na podstawie znaku ", co oznacza, że ​​silnik nie może zoptymalizować" LIKE "do' = ', więc' LIKE' będzie prawie na pewno wolniejszy. Oznacza to również, że dwaj operatorzy zachowują się inaczej w zależności od zestawienia, ale jest to mniej istotne dla tego pytania. – Flimzy

+0

@Flimzy Czy mógłbyś trochę rozwinąć? AFAIK, '=' wykonuje porównanie (oczywiście nie pasujące) również dla każdego znaku, chyba że gdzieś podasz 'binary'. – Binarus

+1

@Binarus Porównanie '=' różni się w przypadku znaków złożonych, takich jak 'ä'. Zobacz [podręcznik po szczegóły] (https://dev.mysql.com/doc/refman/5.7/en/string-comparison-functions.html). – Flimzy

Powiązane problemy