2013-11-15 26 views
8

Voglio solo sapere qual è il più veloce.limite vs esiste vs count (*) vs count (id) in MySQL

Quello che sto cercando di fare è solo controllare se i dati sono presenti sul tavolo. Ho usato "LIMIT" per la maggior parte del tempo ma secondo te o se hai delle basi, qual è il più veloce per verificare se i dati sono esistenti.

Esempio:

limite 1:

SELECT ID 
     FROM TABLE 
     WHERE ID=1 LIMIT 1; 

esiste:

SELECT EXISTS(
       SELECT * 
       FROM TABLE 
       WHERE ID=1); 

count (*):

SELECT (*) 
FROM TABLE; 

count (ID):

SELECT (ID) 
FROM TABLE;" 

aggiuntive: sto usando InnoDB.

+0

'SELECT 1 DA

LIMIT 1'? –

+0

SELECT ID FROM TABLE LIMIT 1 - TABLE è il nome della tabella.: D – Echusen

risposta

13

Il limite è sempre il più veloce, perché itera una riga del tavolo.

Esistono poche differenze con Limite perché basta aggiungere un'altra istruzione di selezione, possiamo dire che ha la stessa efficienza della prima.

Il conteggio itererà tutta la tabella e conterrà il risultato. Quando si utilizza il conteggio (), per impostazione predefinita, mysql conta la chiave primaria della tabella. Ho effettuato alcune prove di conteggio (id), conteggio (), conteggio (campo) e conteggio (1) in una tabella grande, non c'è una grande differenza. A mio parere, "count" proverà sempre a contare l'indice a meno che il campo che contate non sia un indice, ma molte persone hanno detto che dovremmo usare count (id) piuttosto che usare count (*).

In un piccolo tavolo, i quattro modi funzionano tutti bene. Ma se ti unisci a qualche grande tavolo, contare impiegherà molto molto tempo.

Quindi, in tutto, il tempo utilizzato è COUNT (*)> count (id) >> esiste> limite

+0

bella spiegazione 'fratello ..: D, io ospite mi limiterò a LIMIT – Echusen

0

Penso che stiano tutti bene; tranne che rimuoverei le clausole WHERE ID = 1. Se si cancella la tabella e si inizia a reinserire, allora ID 1 non esiste. Solo lo LIMIT 1 farà il trucco. Personalmente non sono favorevole alle opzioni exists e count(*). Preferirei lo count(ID), dato che normalmente avresti un indice su ID quindi mi aspetto che venga eseguito abbastanza velocemente. Per essere sicuri, dovresti cronometrarli (su un tavolo veramente grande) - mi aspetto che vengano fuori qualcosa come exists, limit 1, count(id), count(*) dal più veloce al più lento. (Sono in dubbio per il exists - se effettivamente valuta l'intero SELECT * potrebbe risultare peggiore).

+0

Penso che il TS voglia controllare se esiste una riga specifica nella tabella, non se esiste una riga, e io asumo '1' è solo un esempio – Martijn

+0

In tal caso non tutte e quattro le affermazioni che ha fornito sono equivalenti, e lui dovrebbe chiarire! – CompuChip