Je pensais que ce code P> récupère la rangée de résultats de résultat à la ligne, sans qu'il soit chargé vers la RAM.
Mais je ne trouve aucune référence à cela dans DBI ou MySQL Docs. Comment le jeu de résultats est-il vraiment créé et récupéré? Est-ce que cela fonctionne de la même manière pour des sélectionnes simples et des jointures? P> p>
4 Réponses :
Je ne suis pas très familier avec cela, mais cela me semble que dBD :: MySQL peut soit tout reproduire à l'avant, soit uniquement au besoin, en fonction de l'attribut mysql_use_result. Consultez la documentation DBD :: MySQL et MySQL. P>
Ce n'est pas vrai (si nous parlons du serveur de base de données lui-même, pas de couches de clients). P>
Les Resulatset sont tamponnés si vous utilisez des vues inline ( Même si vous, cependant, peut instruire explicitement mysql code> peut tamponner l'ensemble des résultats, mais ce n'est pas nécessairement fait, et s'il est fait, pas nécessairement dans
RAM code>. P>.
Sélectionnez parmi (SELECT ...) CODE>), la requête doit trier (qui est affichée comme
à l'aide de FilseTort code>), Ou le plan nécessite de créer une table temporaire (qui est indiqué comme
en utilisant temporaire code> dans le plan de requête). p>
à l'aide de temporaire code>,
mysql code> ne conserve que la table en mémoire lorsque sa taille ne dépasse pas la limite définie dans
TMP_TABLE code>. Lorsque la table pousse sur cette limite, elle est convertie de
mémoire code> dans
myisam code> et stocké sur disque. P>
mysql code> pour tamponner les résultatsset en ajoutant
sql_buffer_result code> instruction sur le plus externe
SELECT P>. P>.
Non, ce n'est pas comme ça que ça marche. P>
La base de données ne tiendra pas des lignes en RAM / Swap. p>
Cependant, il va essayer et MySQL essaie de courir ici, de mettre en cache autant que possible (index, résultats, etc.). Votre configuration MySQL donne des valeurs pour les tampons de mémoire disponibles pour différents types de caches (pour différents types de moteurs de stockage) - vous ne devez pas autoriser ce cache à échanger. P>
Testez-le fort> Si vous émettez réellement une préparation sur Également si vous activez le journal des instructions réellement émises à MySQL et que nous vous donnons une transcription que nous (non Perlanks) peut donner une réponse plus définitive sur ce qui serait MySQL. P>
En bout de ligne - il devrait être très facile de tester cela à l'aide du client uniquement (je ne sais pas DBI de Perl, cela pourrait, mais je doute que cela oblige MySQL à tout charger sur préparer). Quoi qu'il en soit ... Testez-le: P>
SELECT SQL_NO_CACHE MILLIVERS_ROWS DE TABLE CODE> puis fetchez seulement quelques lignes hors de millions de milliards.
Vous devriez ensuite comparer les performances avec
Sélectionnez SQL_NO_Cache uniquement_fetched_rows à partir de la table CODE> et voyez comment ce tarif.
Si la performance est comparable (et rapide), je pense que vous pouvez appeler le bluff de votre collègue. P>
Votre collègue a raison. P>
Par défaut, le module Perl DBD :: mysql utilise mysql_store_result, qui lit en effet dans toutes les données de sélection et le cache dans la RAM. À moins que vous ne changez que par défaut, lorsque vous recherchez la ligne par ligne dans DBI, il s'agit simplement de les lire de ce tampon de mémoire. P>
C'est généralement ce que vous voulez sauf si vous avez de très grands ensembles de résultats. Sinon, jusqu'à ce que vous obteniez les dernières données de MySQLD, il doit contenir que les données prêtes et que je crois comprendre est qu'elle provoque des blocs d'écriture sur les mêmes lignes (blocs? Tables?). P>
Gardez à l'esprit, les machines modernes ont beaucoup de bélier. Un ensemble de résultats d'un million de lignes n'est généralement pas un gros problème. Même si chaque rangée est assez importante à 1 Ko, ce n'est que 1 Go de RAM plus frais. P>
Si vous allez traiter des millions de rangées de blobs, vous voulez peut-être que mysql_use_result - ou si vous souhaitez sélectionner ces lignes en morceaux avec des utilisations progressives de Voir mysql_use_result et mysql_store_result dans limite x, y code>. p>
perdc dbd :: mySQL code> pour plus de détails. P>
+1, ne savait pas que DBD :: MySQL fait ça. Cependant, votre commentaire que vous ne devriez pas m'occuper sauf si vous êtes en danger d'appauvrissement de RAM est un mauvais conseil - en règle générale, vous ne devez obtenir que les données dont vous avez besoin et si vous n'avez pas besoin de des lignes de plusieurs millions (et que vous ne le faites pas rarement), Vous ne devriez pas les faire tous. Une telle approche ruinera une évolutivité au-delà de la réparation (la situation est un peu meilleure si la bibliothèque met en cache au niveau de l'application et non au niveau de la session, mais toujours pas bon - si ce cache est souvent invalidé, vous récupérez plusieurs fois 1 Go de données dans lesquelles vous avez besoin. beaucoup moins)
Question sur le but, pourquoi vous devez chercher des lignes d'enregistrement de millions de dollars et d'une extraction d'itérale?
mysqldump code> devrait être plus approprié
@ajreal: Je dois traiter toutes les lignes par ordre d'insertion et générer des rapports.
Ok, est-ce rationnel de faire ça? Utilisation de la fonction MySQL pour générer une vue, la table temporaire n'est pas suffisante pour le rapport? ou même envisager de jeter les gros résultats dans le fichier et ouvrez le fichier de traitement