2010-10-21 4 views
0

PHP: J'ai un script de pagination simple qui utilise deux requêtes.Requête lente MySQL au début, rapide pour les sous-requêtes

MySQL: En utilisant la version serveur 4.1.25 - j'ai deux tables (produits, catégories) avec le champ Item_Num les attacher ensemble pour récupérer les produits par catégorie et les deux ont des champs d'identification uniques qui sont indexés et auto-incrémentée. Ils sont tous deux des types MyISAM.

Requête # 1:SELECT COUNT(*) FROM rituals_collections, rituals_products WHERE rituals_collections.item_num = rituals_products.item_num AND rituals_collections.collection = '$currentCollection' $queryString ORDER BY rituals_products.id

Cela devrait saisir que le nombre d'enregistrements en utilisant ces filtres il n'a pas besoin d'obtenir les données aussi bien pour un temps de charge plus. $ queryString recherche simplement les catégories ou sous-catégories dans l'URL et si elles sont là, il l'ajoute au processus de filtrage. $ currentCollection est ce que l'utilisateur a sélectionné via la liste déroulante.

Requête # 2:SELECT DISTINCT * FROM rituals_collections, rituals_products WHERE rituals_collections.item_num = rituals_products.item_num AND rituals_collections.collection = '$currentCollection' $queryString ORDER BY rituals_products.id LIMIT $offset, $rowsperpage

Je pense que c'est là le goulot d'étranglement se passe. J'ai besoin DISTINCT parce que l'administrateur ne peut pas éliminer ses doublons. Le reste de la requête est identique à l'exception de LIMIT$ offset, $ rowsperpage qui limite les produits à des fins de pagination.

Base de données Captures d'écran

Je captures d'écran disponibles, mais depuis que je suis un nouvel utilisateur, je ne peux pas les poster encore. Je peux les fournir après, je suppose.

Notes finales: J'ai inclus ici l'ensemble du script: http://pastie.org/1239167 La configuration de deux table est située la façon dont il est à cause d'un script 3ème partie de mon client utilise et est inévitable. Et, ceci est lié au CMS MODx mais devrait être assez simple.

Si quelqu'un peut aider, je serais éternellement reconnaissant. Je vous remercie!

+0

J'ai l'impression que vous interrogez DISTINCT sur chaque colonne avec cette requête. Pouvez-vous isoler une seule colonne qui doit être distincte? –

+0

J'ai retiré le DISTINCT et cela prend encore beaucoup de temps. Il a fallu 20 secondes pour charger 3 000 enregistrements alors qu'il fallait moins d'une seconde pour charger n'importe quelle sous-catégorie. Ne devrais-je pas utiliser mysql_num_rows dans la première requête si j'essaye juste d'obtenir un compte? Si oui, quelle serait l'alternative? – Monkeybones

Répondre

0

Il s'est avéré que j'avais un mysql_num_rows inutile sur la deuxième requête de pagination qui réduisait drastiquement le temps de chargement. Maintenant, c'est presque instantané.

Questions connexes