Mysql
 sql >> Base de données >  >> RDS >> Mysql

MySQL :colonnes à faible cardinalité/sélectivité =comment indexer ?

L'indice que vous décrivez est à peu près inutile. Un index est mieux utilisé lorsque vous devez sélectionner un petit nombre de lignes par rapport au nombre total de lignes.

La raison en est liée à la façon dont une base de données accède à une table. Les tables peuvent être évaluées soit par une analyse complète de la table, où chaque bloc est lu et traité à son tour. Ou par une recherche de rowid ou de clé, où la base de données a une clé/rowid et lit la ligne exacte dont elle a besoin.

Dans le cas où vous utilisez une clause where basée sur la clé primaire ou un autre index unique, par ex. where id = 1 , la base de données peut utiliser l'index pour obtenir une référence exacte à l'endroit où les données de la ligne sont stockées. C'est clairement plus efficace que de faire une analyse complète de la table et de traiter chaque bloc.

Revenons maintenant à votre exemple, vous avez une clause where de where status = 'enabled' , l'index renverra 150 millions de lignes et la base de données devra lire chaque ligne à tour de rôle en utilisant de petites lectures séparées. Alors que l'accès à la table avec une analyse complète de la table permet à la base de données d'utiliser des lectures plus importantes plus efficaces.

Il y a un moment où il vaut mieux faire une analyse complète de la table plutôt que d'utiliser l'index. Avec mysql, vous pouvez utiliser FORCE INDEX (idx_name) dans le cadre de votre requête pour permettre des comparaisons entre chaque méthode d'accès à la table.

Référence :http://dev .mysql.com/doc/refman/5.5/en/how-to-avoid-table-scan.html