2009-08-26 5 views
5

Donc, j'ai une table d'abonnements:index Ajout à gerrund tables

id - int(11) (With Primary Key) 
user_id - int(11) 
group_id - int(11) 
role - int(11) 
pending - tinyint(1) 
created_at - datetime 
updated_at - datetime 

que je fais souvent des requêtes pour voir si les utilisateurs ont des droits d'accès similaires à cela:

SELECT * FROM `subscriptions` WHERE (group_id = 1 AND user_id = 2 AND pending = 0) LIMIT 1 

Je suis se demander si l'ajout d'un index unique sur subscriptions(group_id, user_id, pending) aiderait ou gênerait dans ce cas? Quelles sont les meilleures pratiques pour indexer presque toute une table?

Répondre

1

Cela aidera certainement, surtout si vous remplacez * par 1 dans votre requête (si vous voulez juste vérifier que la ligne existe).

Cependant, il peut avoir un petit impact sur DML.

création d'un index est en fait la création d'un B-Tree qui a la structure suivante:

indexed_col1 
indexed_col2 
... 
indexed_colN 
row_pointer 

en tant que clé, le row_pointer étant un décalage de fichier (par MyISAM) ou la valeur de PRIMARY KEY de la ligne (pour InnoDB)

Si vous n'utilisez pas d'autres colonnes mais indexées dans votre requête, toutes les informations dont vous avez besoin peuvent être extraites de l'ondex seul, sans même avoir à faire référence à la table elle-même.

Si vos données sont intrinsèquement uniques, il est toujours bon de créer un index UNIQUE. C'est moins le cas pour MySQL, mais les optimiseurs plus avancés (SQL Server, par exemple) peuvent utiliser le fait que les données sont uniques et construire un plan plus efficace.

Voir cet article dans mon blog pour un exemple:

+0

Désolé pour mon ignorance ... DML? –

Questions connexes