2009-02-18 7 views
28

Prima di tutto, mi riconoscono le differenze tra i due:
- Come mette a disposizione il jolly% e _
- significativo spazio bianco in coda
- emette colationUso COME = contro per corrispondenza esatta stringa

Tutto parità di altre condizioni, per una corrispondenza esatta stringa che è più efficiente:

SELECT field WHERE 'a' = 'a'; 

Oppure:

SELECT field WHERE 'a' LIKE 'a'; 

Oppure: la differenza è così insignificante che non importa?

+4

Baring completamente braindead implementazione, il costo di entrambi i gusti di confronto delle stringhe sarà ridotto al minimo dal costo di spostare i dati dal disco. Scrivi cosa intendi veramente e vai avanti con la programmazione. –

+2

Questo è stato precedentemente coperto [qui] (http://stackoverflow.com/questions/543580/equals-vs-like) su stackoverflow. Spero che aiuti. – user34867

+0

Grazie, ho cercato questo prima di postare ma non l'ho visto in qualche modo. – mluebke

risposta

29

Direi che il = comparatore sarebbe più veloce. Il lessico non invia il confronto con un altro sistema lessicale per fare corrispondenze generali. Invece il motore è in grado di adattarsi o andare avanti. Il nostro db at work ha milioni di righe e an = è sempre più veloce.

3

In un DBMS decente, il motore DB riconoscerebbe che non vi erano caratteri jolly nella stringa e lo trasformava implicitamente in un'uguaglianza pura (non necessariamente uguale a =). Quindi, all'inizio riceverai solo un piccolo calo di prestazioni, solitamente trascurabile per qualsiasi query di dimensioni decenti.

Tuttavia, l'operatore MySQL = non agisce necessariamente come previsto (come puro controllo di uguaglianza). In particolare, non di default tiene conto gli spazi finali per CHAR e VARCHAR di dati, il che significa che:

SELECT age WHERE name = 'pax' 

vi darà le righe per 'pax', 'pax<one space>'e'pax<a hundred spaces>'.

Se si vuole fare una vera e propria verifica uguaglianza, si utilizza la parola chiave binary:

SELECT field WHERE name = binary 'pax' 

È possibile verificare questo con qualcosa di simile:

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

Un buon aggiornamento, ma di maggiore rilevanza a questa domanda, 'LIKE'" esegue la corrispondenza su base per carattere ", il che significa che il motore non può ottimizzare' LIKE' a '=', quindi 'LIKE' sarà quasi certamente più lento. Significa anche che i due operatori si comportano in modo diverso a seconda delle regole di confronto, ma questo è meno rilevante per questa domanda. – Flimzy

+0

@Flimzy Potresti elaborare un po '? AFAIK, '=' esegue un confronto (ovviamente non corrispondente) su base per carattere, a meno che non si specifica 'binary' da qualche parte. – Binarus

+1

@Binarus Il confronto di '=' è diverso per i caratteri composti, come 'ä'. Vedi [il manuale per i dettagli] (https://dev.mysql.com/doc/refman/5.7/en/string-comparison-functions.html). – Flimzy