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

Conseils nécessaires pour indexer correctement une table avec de nombreux champs à rechercher

J'ai une table au travail avec le même genre de chose, beaucoup de colonnes et 1000 façons différentes de sélectionner. C'est un cauchemar. J'ai cependant trouvé certaines combinaisons de filtres qui sont souvent utilisées. Ce sont ceux pour lesquels je créerais des index et laisserais les autres qui sont rarement utilisés pour fonctionner lentement. Dans MSSQL, je peux exécuter une requête pour me montrer les requêtes les plus coûteuses qui ont été exécutées sur la base de données, mySQL devrait avoir une chose similaire. Une fois que je les ai, je crée un index qui couvre les colonnes pour les accélérer. Finalement, vous l'aurez couvert à 90%. Personnellement, je ne concevrais plus jamais une table comme celle-là à moins d'avoir un AK47 pointé sur moi. (mes index sont 3 fois plus volumineux que les données de la table, ce qui n'est pas très cool si vous devez ajouter un groupe ou des enregistrements). , mais cela ajouterait des maux de tête ailleurs.

Tableau des utilisateurs (ID utilisateur, nom)

1, Lisa
2, Jane
3, John

Tableau des attributs utilisateur (ID utilisateur, nom d'attribut, valeur d'attribut)

1, EYES, Brown
1, GENDER, Female
2, EYES, Blue
2, GENDER, Female
3  EYES, Blue
3, GENDER, Male

Cela accélérerait l'identification des attributs, mais rendrait vos requêtes moins simples à écrire.

SELECT UserID, COUNT(*) as MatchingAttributes
FROM   UserAttributes 
WHERE  (UserAttributes.AttributeName = 'EYES' AND UserAttributes.AttributeValue = 'Blue') OR
       (UserAttributes.AttributeName = 'GENDER' AND UserAttributes.AttributeValue = 'Female') 

Cela devrait renvoyer ce qui suit

UserID, MatchingAttributes
1, 1
2, 2
3, 1

Il vous suffit alors d'ajouter HAVING COUNT(*) =2 à la requête pour ne sélectionner que les identifiants qui correspondent. C'est un peu plus compliqué à sélectionner, mais cela donne également une fonctionnalité intéressante, disons que vous filtrez sur 10 attributs et renvoyez tous ceux qui ont 10 correspondances. Cool, mais disons qu'aucun ne correspond à 100 %. Vous pourriez dire hé, je n'en ai trouvé aucun qui corresponde, mais ceux-ci avaient 9 sur 10 ou une correspondance à 90%. (Assurez-vous simplement que si je recherche une femme blonde aux yeux bleus, je ne reçois pas de message disant qu'aucune n'a été trouvée, mais voici les prochaines plus proches correspondants contenant des mecs blonds aux yeux bleus avec un score correspondant de 60%. Ce serait être très pas cool)

Il y a plus de choses qui devraient être prises en compte si vous choisissiez de diviser le tableau, comme comment stocker les attributs sous forme de nombres, de dates et de texte dans une seule colonne ? Ou s'agit-il de tables ou de colonnes séparées. Pas de réponse facile, que ce soit une table large ou des tables divisées.