2011-01-09 2 views
0

Je fais face à des blobs jusqu'à - j'estime - environ 100 kilo-octets en taille . Les données sont déjà compressées.MySQL: Blobbing efficace?

moteur de stockage InnoDB MySQL 5.1

Frontend: PHP (Symfony Propel ORM)

Quelques questions:

  • je l'ai lu quelque part que ce n'est pas bon de mettre à jour blobs , parce que il conduit à la réallocation, la fragmentation, et donc mauvaises performances . Est-ce vrai? Toute référence à ce sujet? Initialement, les blobs sont construits en ajoutant des blocs de données. Chaque bloc a une taille maximale de 16 kilo octets. Est-il plus efficace d'utiliser une table de blocs séparés à la place, par exemple avec des champs comme ci-dessous?

    parent_id, position, chunk

    Ensuite, pour obtenir l'ensemble de blob, on pourrait faire quelque chose comme:

    SELECT GROUP_CONCAT(chunk ORDER BY position) FROM chunks WHERE parent_id = 187

    Le résultat serait utilisé dans un script PHP.

  • Y at-il une différence entre les types de blobs, à l'exception de la taille nécessaire pour les métadonnées, qui devrait être négligeable.

+0

GROUP_CONCAT() n'est pas un bon candidat pour cela. Par défaut, il est limité à une longueur maximale de 1024 octets (bien que vous puissiez le modifier avec le group_concat_max_len). Vous devez également être très prudent lors de la construction de la requête - que se passe-t-il si les fragments sont groupés/concaténés dans le mauvais ordre? –

+0

Je ne vois pas de problème avec la limite, car elle peut être étendue. Concernant la concaténation dans le bon ordre: C'est pourquoi je propose le champ 'position'. Cela ne devrait-il pas être suffisant? – feklee

+0

sélectionnez simplement chaque morceau et concattez-les en PHP. ou, si vous les publiez, affichez-les sans les concaténer du tout. – araqnid

Répondre

1

Si vous créez et supprimer des données dans un tableau, vous obtiendrez la fragmentation de la structure de données de table.

Je ne pense pas que vous pouvez gagner quoi que ce soit par blobs diviser en morceaux - vous ne gagnez rien par des données fragmenter avant fragments DB it :)

Vous pouvez défragmenter la structure de table en reconstruisant (OPTIMIZE TABLE dans MySQL).

Je n'ai pas pu trouver d'informations sur la façon dont MySQL stocke les blobs sur le disque. Si elle les stocke avec d'autres données de ligne, vous pouvez utiliser l'index clusterisé (PK dans InnoDB, ALTER TABLE ORDER BY dans MyISAM) pour requérir un ordre de données particulier dans le fichier de données de la table (par exemple, trié par popularité pour créer une zone "chaude" cherchant un peu).

En plus de la fragmentation de la structure de la base de données, il y a un problème de fragmentation du fichier de la table dans le système de fichiers.

Même si vous avez uniquement inséré des données dans la table sans aucune fragmentation de la table elle-même, le système de fichiers qui contient le fichier table le fragmentera tôt ou tard sur le disque. C'est inévitable sur les systèmes de fichiers sécurisés car ils ne mettent jamais à jour les données du fichier sur place.

si la fragmentation est un problème, alors je l'attaquerais au plus bas niveau possible. Ne stockez pas d'objets blob dans la base de données, ne stockez que quelques références aux fichiers sur le disque.

Les systèmes de fichiers sont plus proches du disque physique, de sorte qu'ils peuvent gérer la fragmentation bien mieux que la requête DB, avec quelques niveaux d'abstraction au-dessus. Certains systèmes de fichiers défragmenter automatiquement petits fichiers, mais laisser les fichiers volumineux fragmentés. Ou vous pouvez simplement lancer le matériel sur le problème - utiliser RAID, ajouter une tonne de RAM pour les caches disque/DB ou utiliser SSD.

Et bien sûr, vous l'avez comparé avec soin et vous savez que la fragmentation est un problème en premier lieu, n'est-ce pas?

+0

En fait, j'ai découvert que - à partir de maintenant - la fragmentation n'est pas un problème. Après l'introduction de la compression, les blobs sont - en général - assez petits (jusqu'à quelques kilo-octets) et les opérations d'ajout sont peu fréquentes. Les priorités ont donc changé un peu. Cependant, je suis toujours intéressé par la différence entre les types de données blob. Aussi, je me souviens avoir lu que MySQL stocke de gros blobs dans un endroit différent de celui des petits blobs, et que c'est beaucoup moins efficace. Ce serait une autre raison d'utiliser une table de morceaux séparée, outre la fragmentation - oui -. Pas un problème cependant, pour le moment. – feklee

Questions connexes