J'ai une application où les utilisateurs peuvent sélectionner une variété d'intérêts d'environ 300 intérêts possibles. Chaque intérêt sélectionné est stocké dans une table de jointure contenant les colonnes user_id et interest_id.Algorithme pour trouver des utilisateurs similaires à travers une table de jointure
utilisateurs typiques sélectionner environ 50 intérêts sur la 300.
Je voudrais construire un système où les utilisateurs peuvent trouver les 20 premiers utilisateurs qui ont le plus d'intérêts en commun avec eux.
En ce moment, je suis en mesure d'accomplir ceci en utilisant la requête suivante:
SELECT i2.user_id, count(i2.interest_id) AS count
FROM interests_users as i1, interests_users as i2
WHERE i1.interest_id = i2.interest_id AND i1.user_id = 35
GROUP BY i2.user_id
ORDER BY count DESC LIMIT 20;
Cependant, cette requête prend environ 500 millisecondes pour exécuter avec 10.000 utilisateurs et 500.000 lignes dans la table de jointure. Tous les index et les paramètres de configuration de la base de données ont été ajustés au mieux de mes capacités.
J'ai aussi essayé d'éviter l'utilisation des jointures avec tout à fait la requête suivante:
select user_id,count(interest_id) count
from interests_users
where interest_id in (13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,508)
group by user_id
order by count desc
limit 20;
Mais celui-ci est encore plus lent (~ 800 millisecondes).
Comment est-ce que je pourrais mieux réduire le temps que je peux rassembler ce genre de données à moins de 100 millisecondes? J'ai envisagé de mettre ces données dans une base de données graphique comme Neo4j, mais je ne suis pas sûr si c'est la solution la plus simple ou si elle serait même plus rapide que ce que je fais actuellement.
Merci. J'ai effectivement remarqué l'erreur plus tard, mais j'ai oublié de mettre à jour ma réponse. Votre code est aussi un peu plus propre que ce que j'avais mis ensemble. – Gdeglin