J'ai une question sur le type de données blob
dans MySQL.
J'ai lu que le type de données peut être utilisé pour stocker des fichiers. J'ai également lu qu'une alternative est de stocker le fichier sur le disque et d'inclure un pointeur vers son emplacement dans la base de données (via une colonne varchar).
Mais je suis un peu confus parce que j'ai lu que les champs d'objets blob ne sont pas stockés en ligne et nécessitent une recherche distincte pour récupérer son contenu. Est-ce différent de stocker un pointeur sur un fichier sur le système de fichiers?
J'ai lu que le type de données peut être utilisé pour stocker des fichiers.
Selon MySQL manual page sur Blob, A BLOB
est un gros objet binaire qui peut contenir une quantité variable de données.
Comme il s'agit d'un type de données spécifique au stockage de données binaires, il est courant de l'utiliser pour stocker des fichiers au format binaire, le stockage de fichiers image étant une utilisation très courante sur les applications Web.
Pour les applications Web, cela signifie que vous devez d'abord convertir votre fichier au format binaire, puis le stocker, et chaque fois que vous avez besoin de récupérer votre fichier, vous devrez effectuer le processus inverse pour les reconvertir à son format d'origine.
En outre, le stockage d'une grande quantité de données dans votre base de données [~ # ~] peut [~ # ~] le ralentir. Spécialement dans les systèmes qui ne sont pas dédiés uniquement à héberger une base de données.
J'ai également lu qu'une alternative est de stocker le fichier sur le disque et d'inclure un pointeur vers son emplacement dans la base de données
En gardant à l'esprit toutes les considérations ci-dessus, une pratique courante pour les applications Web consiste à stocker vos fichiers ailleurs que sur MySQL, puis à simplement stocker son chemin sur votre base de données. Cette approche [~ # ~] peut [~ # ~] accélérer votre base de données lorsque vous traitez une grande quantité de données.
Mais je suis un peu confus car j'ai lu que les champs d'objets blob ne sont pas stockés en ligne et nécessitent une recherche distincte pour récupérer son contenu.
En fait, cela dépendrait du moteur de stockage que vous utilisez, car chaque moteur traite les données et les stocke de différentes manières. Pour le moteur InnoDB, qui convient à la base de données relationnelle, vous pouvez lire cet article de MySQL Performance blog sur la façon dont le blob est stocké dans MySQL.
Mais en résumé, sur MySQL 5 et en avant, le blob est stocké comme suit:
Innodb stocke soit un objet blob entier sur la page de ligne, soit uniquement un pointeur BLOB de 20 octets, ce qui donne la préférence aux colonnes plus petites à stocker sur la page, ce qui est raisonnable car vous pouvez en stocker davantage.
Donc, vous pensez probablement maintenant que la bonne façon de procéder est de les stocker dans un fichier séparé, mais il y a certains avantages à utiliser blob pour stocker des données, le premier (à mon avis) est la sauvegarde. Je gère un petit serveur et j'ai dû créer un autre sous-programme uniquement pour copier mes fichiers stockés en tant que chemins vers un autre disque de stockage (nous ne pouvions pas nous permettre d'acheter un système de sauvegarde sur bande décent). Si j'avais conçu mon application pour utiliser des blobs, un simple mysqldump
serait tout ce dont j'avais besoin pour sauvegarder toute ma base de données.
L'avantage de stocker des objets blob pour les sauvegardes est mieux discuté sur ce post où la personne qui a répondu a eu un problème similaire au mien.
Un autre avantage est la sécurité et la facilité de gestion des autorisations et des accès. Toutes les données de votre serveur MySQL sont protégées par mot de passe et vous pouvez facilement gérer les autorisations de vos utilisateurs sur qui accède à quoi et qui ne le fait pas.
Dans une application qui s'appuie sur le système de privilèges MySQL pour l'authentification et l'utilisation. C'est certainement un plus car il serait un peu plus difficile pour un envahisseur de récupérer une image (ou un fichier binaire comme un fichier zippé) depuis votre disque ou un utilisateur sans privilèges d'accès pour y accéder.
Je dirais donc que
Si vous allez gérer votre MySQL et toutes les données que vous y avez et devez faire des sauvegardes régulières ou si vous avez l'intention de changer ou même d'envisager un futur changement de système d'exploitation, et d'avoir un matériel décent et optimisé votre MySQL, optez pour BLOB.
Si vous ne gérerez pas votre MySQL (comme dans un hôte Web par exemple) et n'avez pas l'intention de changer le système d'exploitation ou de faire des sauvegardes, restez avec varchar
colonnes pointant vers vos fichiers.
J'espère que cela a aidé. À votre santé
Si vous stockez des données dans un champ BLOB, vous les intégrez à l'abstraction de votre objet.
Avantages BLOB:
Si vous souhaitez supprimer une ligne avec BLOB, ou la supprimer dans le cadre d'une relation de table maître/esclave ou peut-être de toute la hiérarchie de table, votre BLOB est géré automatiquement et a la même durée de vie que tout autre objet de la base de données.
Vos scripts n'ont pas besoin d'accéder à autre chose qu'à la base de données pour obtenir tout ce dont ils ont besoin. Dans de nombreuses situations, l'accès direct aux fichiers peut ouvrir des vers entiers sur la façon de contourner les restrictions d'accès ou de sécurité. Par exemple, avec l'accès aux fichiers, ils peuvent avoir à monter des systèmes de fichiers contenant des fichiers réels. Mais avec BLOB dans la base de données, il vous suffit de pouvoir vous connecter à la base de données, où que vous soyez.
Si vous le stockez dans un fichier et que le fichier est remplacé, supprimé ou n'est plus accessible, votre base de données ne le saura jamais - en effet, vous ne pouvez pas garantir l'intégrité. En outre, il est difficile de prendre en charge de manière fiable plusieurs versions lors de l'utilisation de fichiers. Si vous utilisez et dépendez des transactions, cela devient presque impossible.
Avantages du fichier:
Certaines bases de données gèrent plutôt mal les BLOB. Par exemple, alors que la limite officielle BLOB dans MySQL est de 4 Go, mais en réalité, elle n'est que de 1 Mo dans la configuration par défaut. Vous pouvez augmenter cela à 16-32 Mo en modifiant la configuration du client et du serveur pour augmenter le tampon de commande MySQL, mais cela a beaucoup d'autres implications en termes de performances et de sécurité.
Même si la base de données n'a pas de limites de taille étranges, elle aura toujours une surcharge de stockage de BLOB par rapport à un simple fichier. De plus, si BLOB est volumineux, certaines bases de données ne fournissent pas d'interface pour accéder blob morceau par morceau, ou stream
, ce qui peut être un obstacle important pour votre flux de travail.
En fin de compte, cela dépend de vous. J'essaie généralement de le conserver dans BLOB, sauf si cela crée des problèmes de performances déraisonnables.
Oui, les blobs MySQL qui ne tiennent pas dans la même page qu'une ligne sont stockés sur les pages de débordement. Notez que certains blobs sont suffisamment petits pour être stockés avec le reste de la ligne, comme n'importe quelle autre colonne. Les pages d'objets blob ne sont pas adjacentes à la page sur laquelle leur ligne est stockée, elles peuvent donc entraîner des E/S supplémentaires pour les lire.
D'un autre côté, comme avec tout autre type de page, les pages d'objets blob peuvent occuper de la mémoire dans le pool de mémoire tampon InnoDB, donc la lecture des objets blob par la suite est très rapide même s'ils se trouvent sur des pages distinctes. Les fichiers peuvent être mis en cache par le système d'exploitation, mais ils sont généralement lus à partir du disque.
Voici quelques autres facteurs qui peuvent influer sur votre décision:
Les blobs sont stockés logiquement avec une ligne. Cela signifie que si vous SUPPRIMEZ la ligne, le blob associé est supprimé automatiquement. Mais si vous stockez le blob en dehors de la base de données, vous vous retrouvez avec des fichiers blob orphelins après avoir supprimé des lignes de la base de données. Vous devez effectuer des étapes manuelles pour rechercher et supprimer ces fichiers.
Les objets blob stockés dans la ligne suivent également la sémantique des transactions. Par exemple, un nouveau blob ou un blob mis à jour est invisible pour les autres transactions jusqu'à ce que vous le validiez. Vous pouvez également annuler une modification. Le stockage d'objets blob dans des fichiers en dehors de la base de données rend la tâche beaucoup plus difficile.
Lorsque vous sauvegardez une base de données contenant des objets blob, la base de données est beaucoup plus grande bien sûr, mais lorsque vous sauvegardez, vous obtenez toutes les données et les objets blob associés en une seule étape. Si vous stockez des objets blob en externe, vous devez sauvegarder la base de données et également sauvegarder le système de fichiers où vous stockez les fichiers blob. Si vous devez vous assurer que les données et les objets blob sont capturés à un instant donné, vous devez à peu près utiliser une sorte d'instantanés de système de fichiers.
Si vous utilisez la réplication, le seul moyen automatique de s'assurer que les objets blob sont copiés automatiquement sur l'esclave de réplication est de stocker les objets blob dans la base de données.
La meilleure approche consiste à stocker votre fichier dans le dossier du système de fichiers et à pointer vers leurs chemins d'accès via un champ varchar dans la base de données. L'un des inconvénients de l'enregistrement de fichiers dans la base de données est de la ralentir ou de réduire ses performances.
L'accès au système de fichiers sera plus rapide que via la base de données. Les colonnes de blobs présentent certains inconvénients en termes d'indexation/tri, etc., ce que vous pourriez faire avec votre colonne de nom de fichier si vous le souhaitez à l'avenir.
La base de données peut également se développer rapidement avec de gros objets blob, puis les tâches comme la sauvegarde deviennent plus lentes. J'irais avec un emplacement de fichier dans la base de données avec le stockage physique sur le système de fichiers.