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

Ottimizzazione query MySQL di LIKE term% ORDER BY int

Hai posto un'altra domanda "Creazione di un indice migliore per la ricerca con caratteri jolly attraverso 40 milioni di nomi". Ok, hai 40 milioni di record.

Ora considera la seguente formula:

x = COUNT(DISTINCT values in a column) / COUNT(values in a column)

Un indice su una colonna è molto meglio, più è vicino a x è a 1. Se è 1, tutti i valori sono distinti, non ci sono duplicati e quindi un indice è abbastanza veloce.

Ora stai cercando 'john%'. Sono 4 lettere e una fine aperta. Quali lettere non sono importanti, il tuo DB deve gestire 26*26*26*26=456976 valori distinti. Mettilo nella formula sopra e i tuoi 40 milioni di record. Ottieni una x di 0,0114244.

Non so di nuovo qual è la soglia, ma IIRC è 0,1 o qualcosa del genere. Quindi, se sei x è superiore a 0,1 viene utilizzato l'indice, se è inferiore non lo è.

Perchè è così? L'uso di un indice può persino rallentare le cose, perché il tuo DB deve guardare l'indice, vedere in quell'indice in quale posizione sul tuo disco rigido fisico si trova il record appropriato e quindi ottenere quel record. Pertanto, quando x è inferiore al 10%, è più veloce eseguire la scansione dell'intera tabella.

Per riassumere:filtrare 40 milioni di record con un solo indice debole come il tuo è semplicemente inutile.