2014-10-19 22 views
5

Supponiamo di avere una tabella che assomiglia a questo:Confronto byte byte per byte, che è più veloce? binario vs bin_collate

create table t1(c1 varchar(x)collate utf8mb4_general_ci, index(c1)) 

Per fare confronti di byte-sensibili, abbiamo praticamente abbiamo due modi (si presuppone che tutti stringhe rilevanti fanno spazi non sono finali, vale a dire che sono tutti padspace-compliant):

select*from t1 where c1 ='test'collate utf8mb4_bin 

select*from t1 where c1 = binary'test' 

Quale dovrebbe essere preferito quando le prestazioni sono di preoccupazione?

Quando si utilizza un indice di raccolta carattere non binario, è più veloce per compare con binary string o confronto binario?

(Aggiunta di una nuova colonna alla tabella solo per memorizzare l'equivalente binario di c1 è un grande successo per il magazzinaggio e non è possibile.)

(PS Gradirei una risposta che mette a confronto sia hash e confronti btree, anche se Sono principalmente interessato al confronto btree.)

+1

Nel vostro test fino ad ora, che cosa hai trovato? –

+0

aggiungere un indice a c1 potrebbe essere un miglioramento, se le prestazioni sono preoccupanti; inoltre, che tipo di valori possibili possono avere? potrebbero inserirsi in un enum? forse devi aggiungere una colonna con variante pre-elaborata di c1? – Ashalynd

+0

Che i numeri siano bizzarri e abbastanza vicini da arrivare a qualsiasi conclusione utilizzando test unilaterali. @Ashalynd, L'indice è già 'utf8mb4_general_ci'. I valori memorizzati sono "parole inglesi" anche se gli utenti possono digitare caratteri casuali, anche caratteri cinesi. – Pacerier

risposta

0

Come si ha indice nella tabella, per la corrispondenza binaria utilizzare binario per costante, non per la colonna. Questo sarà più veloce di entrambe le opzioni.

select * from t1 where c1 = binary 'test' 

risposta a mettere in discussione è l'opzione 1 sarà più veloce, dove si sta facendo

WHERE c1 collate utf8mb4_bin='test' 
+0

Grazie per il suggerimento, ho aggiornato la domanda per mettere il casting sul lato destro (a differenza del lato sinistro). Quindi, con il casting sul lato destro per entrambi i casi, è possibile eseguire il casting sulla stringa binaria più velocemente o eseguire il casting su regole binarie più veloci? – Pacerier

+0

Ok..Grande .. In questo caso la collazione sarà più veloce. Ma preferirò il binario in quanto esclude i valori come 'test' (con lo spazio finale) e la collation includerà quello. Ma se la tua esigenza è di includere anche 'test', allora vai avanti con il confronto –

+0

La conversione binaria di un personaggio occupa più spazio del binario collazionato di un valore varchar. Questo link potrebbe aiutare. [collegamento] (http://dev.mysql.com/doc/refman/5.0/en/charset-binary-collations.html) –