2009-10-02 7 views
1

J'ai un petit problème avec quelques ajouts tardifs à un projet, mysql et PHP.Mysql Ordre par valeur calculée - Pondérations définies par l'utilisateur des catégories

Nous avons une table dans mysql avec 200 000 lignes, chacune avec une catégorie assignée. À l'origine, l'instruction select retirait simplement les éléments requis en fonction d'une clause where et d'un ordre par un identifiant indexé. Très rapide.

Cependant, certains utilisateurs ont demandé la possibilité de donner des pondérations à chaque catégorie (financière = 60%, crédit = 25%, assurance = 15%) et d'activer une case à cocher pour dégrader les résultats avec le temps. L'instruction doit maintenant calculer une valeur (catégorie * pondération) et si la case à cocher est activée (catégorie * pondération * 1/jour) pour chaque résultat renvoyé par la clause where. Il doit ensuite commander par cette valeur calculée. Comme vous pouvez l'imaginer, c'est lent (~ 10 secondes) pour chaque requête. Maintenant je ne sais pas quelle est la meilleure façon de procéder ici car je ne sais pas comment avoir une table contenant ces valeurs calculées pour l'indexation (parce que l'utilisateur peut sélectionner n'importe quelle variation). Également des problèmes surviennent si vous essayez de simplifier le tri (ordre par pondération, date) car cela est évidemment différent de (ordre par pondération) 80% * cat * 1/8days = 0.1 et 20% * cat * 1/1day = 0.2 qui est plus élevé mais n'apparaîtra pas plus haut dans le premier tri.

J'ai un accès complet à la base de données et au code. Quelqu'un a-t-il des conseils sur la façon de réaliser ce genre de pratique sans anéantir la performance?

Vive Tous

+0

On ne sait pas pourquoi cela prend 10 secondes. La requête de l'utilisateur sélectionne-t-elle un grand nombre de lignes? –

+0

Salut, la majorité des clauses where retournent plus de 20 000 lignes qui doivent être commandées puis limitées aux 500 premières. La valeur doit être calculée pour ces ~ 20 000 lignes. Il est difficile de réduire le nombre de lignes renvoyées par la clause where, en plaçant des limites à la date/d'autres valeurs, on omettra parfois les éléments qui devraient être renvoyés. –

Répondre

0

D'après votre description, il semble que les critères de classement peuvent être différents pour chaque ligne de chaque requête. Votre seule option peut être de lancer plus de matériel dans la base de données ou d'utiliser une base de données différente.

EDIT: Si l'ensemble de données n'est pas mis à jour fréquemment, vous pourrez peut-être identifier les ensembles de paramètres et les index précalculés les plus couramment utilisés.

Questions connexes