2010-01-15 5 views
6

structure de base de données:requêtes MYSQL multiples contre plusieurs boucles foreach php

id galleryId     type  file_name  description 
1 `artists_2010-01-15_7c1ec` `image` `band602.jpg` `Red Umbrella Promo` 
2 `artists_2010-01-15_7c1ec` `image` `nov7.jpg`  `CD Release Party` 
3 `artists_2010-01-15_7c1ec` `video` `band.flv`  `Presskit` 

Je vais tirer des images pour une partie d'une application, des vidéos sur un autre, etc. Est-il préférable de faire plusieurs mysql requêtes pour chaque section comme ceci:

$query = mysql_query("SELECT * FROM galleries WHERE galleryId='$galleryId' && type='image'); 

... Ou devrais-je construirai un tableau associatif et boucle juste à travers le réseau encore et chaque fois que je dois utiliser le jeu de résultats?

Merci pour les pensées.

Répondre

8

Cela dépend de ce qui est le plus important: la lisibilité ou la performance. Je m'attendrais à ce qu'une seule requête et à la mise en place de tableaux PHP soient plus rapides à exécuter, car les connexions à la base de données sont coûteuses, mais une simple requête pour chaque section est beaucoup plus lisible. À moins que vous ne le sachiez (et pas seulement l'espoir), vous obtiendrez une énorme quantité de trafic que j'irais pour des requêtes séparées, puis je m'inquiéterais de l'optimisation si cela semble être un problème. À ce stade, il y aura d'autres choses que vous aurez envie de faire, comme construire une couche d'accès aux données et ajouter de la mise en cache.

+0

Merci à tous - celui-ci (s'il est vrai) a plus de sens pour moi car il n'y aura jamais qu'une poignée de fichiers dans chaque catégorie. Une requête c'est. – jay

0

Mieux vaut avoir plusieurs requêtes. Chaque fois que vous lancez une requête, toutes les données sont extraites et chargées en mémoire. Si vous avez 5 types différents, cela signifie que chaque page de ce type charge 5 fois plus de données que nécessaire.

Même avec un seul à la fois, vous aurez probablement envie de commencer à paginer avec des requêtes LIMIT/OFFSET assez rapidement si vous en avez plus de 100 ou autant que vous pouvez raisonnablement afficher sur une seule page à la fois.

2

Si par "sections" vous voulez dire des pages séparées séparées (requêtes HTTP séparées) que les utilisateurs peuvent voir, je suggère une requête par type si nécessaire. Si sur une page où il n'y a que des jeux de données d'images, vous n'avez pas besoin d'extraire l'ensemble de données vidéo par exemple. Vous n'allez pas vraiment gagner beaucoup de temps à tout extraire, puisque vous vous connecterez à la base de données pour chaque page atteinte (je suppose.)

Si par "sections" vous voulez dire différentes parties d'une page, alors allez chercher immediatement. Cela vous permettra de gagner du temps lors de l'interrogation (une seule requête.)

Mais en fonction de la taille de votre fichier, vous pourriez rencontrer des problèmes avec la limite de mémoire de PHP pour tout interroger. Vous pouvez alors essayer d'augmenter la limite de mémoire, mais si cela échoue, vous devrez probablement revenir à la requête par type. L'utilisation de l'approche query-per-type déplace une partie de la charge de calcul vers le serveur de base de données, car vous ne demanderez et ne récupérerez que ce dont vous avez réellement besoin. Et vous n'avez pas besoin d'écrire du code pour filtrer et trier vos résultats. Le filtrage et le tri sont quelque chose que la base de données est généralement meilleure que le code PHP. Dans la mesure du possible, activez le cache de requêtes de MySQL, ce qui accélérera beaucoup plus ces requêtes que tout ce que vous pourriez écrire en PHP.

1

Si vos données proviennent toutes d'une table, je ne ferais qu'une requête.

Je présume que vous construisez une seule page avec une section pour les photos, une section pour la vidéo, une section pour la musique, etc Ecrire votre requête retourner les résultats triés par type de média - parcourir toutes les images, puis toutes les vidéos , puis toute la musique.

Questions connexes