Mysql
 sql >> Database >  >> RDS >> Mysql

MySQL sono i miei indici buoni?

Scrivi la query in questo modo:

SELECT *
    FROM orders
    JOIN users  ON orders.id_user = users.id
    WHERE orders.status='new'

Non specificare quali indici utilizzare.

A partire da WHERE clausola, sembra che potrebbe essere utile:INDEX(status) . Ma poiché "status" suona come un "flag" con cardinalità bassa, l'ottimizzatore potrebbe decidi di ignorare l'indice e di eseguire semplicemente una scansione della tabella. Va bene. Va bene perché è più veloce eseguire una scansione della tabella che rimbalzare tra un indice e i dati, quando l'indice non è molto selettivo. In ogni caso, lascia la decisione allo Strumento per ottimizzare.

Ora che ha a che fare con orders , è necessario JOIN a users . L'unico modo per farlo è avere un indice su id . Quel nome ("id") implica che potrebbe essere la PRIMARY KEY , è? (Per favore fornisci SHOW CREATE TABLE .)

Ricettario indice

L'altra domanda che hai menzionato dovrebbe essere scritta

SELECT * FROM users WHERE id=33

E, come già detto, l'indice (PRIMARY KEY ?) su id è la cosa giusta.

Non vi è alcun vantaggio (per i dati SELECTs , almeno) per INDEX(status, id_user) . La tua selezione include tutte le colonne (* ); aveva recuperato solo id_user , quindi un tale indice sarebbe "coprente" e avrebbe qualche vantaggio.