La compression du texte avant de les stocker dans la base de données
J'ai besoin de stocker une très grande quantité de texte dans la base de données mysql. Il sera des millions d'enregistrements dont le champ type LONGTEXT et de la taille de base de données va être énorme.
Donc, je tiens à me demander, si il existe un moyen sûr pour compresser le texte avant de le ranger dans un champ de TEXTE pour économiser de l'espace, avec la possibilité de l'extraire de retour si besoin?
Quelque chose comme:
$archived_text = compress_text($huge_text);
//saving $archived_text to database here
//...
//...
//getting compressed text from database
$archived_text = get_text_from_db();
$huge_text = uncompress_text($archived_text);
Est-il un moyen de le faire avec php ou mysql? Tous les textes sont codés en utf-8.
Mise à JOUR
Ma demande est un grand de la littérature site web où les utilisateurs peuvent ajouter leurs textes. Voici le tableau que j'ai:
CREATE TABLE `book_parts` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`book_id` int(11) NOT NULL,
`title` varchar(200) DEFAULT NULL,
`content` longtext,
`order_num` int(11) DEFAULT NULL,
`views` int(10) unsigned DEFAULT '0',
`add_date` datetime DEFAULT NULL,
`is_public` tinyint(3) unsigned NOT NULL DEFAULT '1',
`published_as_draft` tinyint(3) unsigned NOT NULL DEFAULT '0',
PRIMARY KEY (`id`),
KEY `key_order_num` (`order_num`),
KEY `add_date` (`add_date`),
KEY `key_book_id` (`book_id`,`is_public`,`order_num`),
CONSTRAINT FOREIGN KEY (`book_id`) REFERENCES `books` (`id`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8
Actuellement elle dispose de près de 800 enregistrements et des poids de 4 GO, 99% des requêtes SELECT. J'ai toutes les raisons de penser que le nombre augmente de manière schématique. Je ne voudrais pas d'enregistrer les textes dans les fichiers car il est assez lourd logique et mon site a très peu de résultats.
Vous pouvez vouloir reconsidérer votre droit de veto sur la base de fichiers de stockage. Je ne suis pas sûr de ce que vous entendez à propos de "lourd logique", mais je ne vois pas comment stocker les textes dans la base de données sera automatiquement mieux que des fichiers pour un site avec beaucoup de circulation.
OriginalL'auteur Silver Light | 2011-11-22
Vous devez vous connecter pour publier un commentaire.
Allez-vous à l'index de ces textes. Quelle est la taille de la charge en lecture sur ce texte? Insérez la charge?
Vous pouvez utiliser InnoDB de compression de données - transparent et moderne. Voir docs pour plus d'info.
Si vous avez vraiment énorme textes (par exemple, chaque texte est au-dessus de 10 MO), que de la bonne idée, c'est de ne pas les stocker dans Mysql. Magasin compressé par gzip textes dans le système de fichiers et seuls les pointeurs et les méta dans mysql. Vous pouvez facilement étendre votre espace de stockage dans l'avenir et de se déplacer, par exemple, DFS.
Mise à jour: un autre avantage de stocker des textes en dehors de Mysql: base de données des séjours à petit et rapide. Moins: forte probabilité de données inconsistance.
Mise à jour 2: si vous avez beaucoup de programmation resourses, s'il vous plaît, jetez un oeil à des projets comme celui-ci: http://code.google.com/p/mysql-filesystem-engine/.
Dernière mise à Jour: selon vos informations, vous pouvez simplement utiliser InnoDB de compression est le même que ZIP. Vous pouvez commencer avec ces params:
Plus tard, vous aurez besoin de jouer avec
KEY_BLOCK_SIZE
. VoirSHOW STATUS LIKE 'COMPRESS_OPS_OK'
etSHOW STATUS LIKE 'COMPRESS_OPS'
. Le Ratio de ces deux paramètres doit être proche de 1.0: Docs.veuillez jeter un oeil à la mise à jour. Ai-je bien compris, que innodb compression compresse index uniquement? Que ce n'est pas mon cas...
Non, la compression est utilisée pour les données et tous les index (PK, secondaire, composé).
Merci pour la réponse. Je vais aller dans cette voie, car cela exige minimum de modifications dans mon application.
S'il vous plaît, n'oubliez pas, que la compression nécessite beaucoup d'exigences à respecter. Début de version de mysql manière particulière de stockage des tables. Vous aurez besoin d'un "fichier par table", comme je l'ai rememeber. Tout ce que vous pouvez trouver dans les docs: dev.mysql.com/doc/innodb-plugin/1.0/en/...
OriginalL'auteur Oroboros102
Si vous êtes à la compression (par exemple. gzip), puis ne pas utiliser les champs de TEXTE de toute sorte. Ils ne sont pas binaires. Les données dans/sortir des champs de texte est soumis au jeu de caractères de la traduction, ce qui a probablement (mais pas nécessairement) coder les données compressées et vous donner un corrompu résultat lorsque vous récupérez/décompressez le texte.
Utiliser des champs de type BLOB au lieu de cela, qui sont binaires-transparent et ne pas la traduction d'une de données.
La compression priverait de la capacité de recherche dans le texte, puisque vous auriez à décompresser pour obtenir les premières tester à nouveau. Si vous n'allez pas utiliser la DB à fouiller le texte, alors ne stockent pas les comprimés (ou raw) de texte dans la base de données en premier lieu. Stocker à l'extérieur dans un fichier et le stocker quelques références (nom de fichier/chemin) dans la DB à la place.
gzcompress fonctionne très bien avec cette approche, mais veuillez considérer: mysqlperformanceblog.com/2008/01/11/...
OriginalL'auteur Marc B
Il pourrait être préférable de définir le champ de texte comme blob, et de compresser les données en PHP pour économiser sur les coûts de communication.
En PHP, l'utilisation gzcompress et gzuncompress.
OriginalL'auteur user1931858
Vous pouvez également utiliser une COMPRESSE option pour activer la compression des paquets.
Lire quelques informations sur cette option:
Pour PHP, j'ai trouvé ce - MYSQLI_CLIENT_COMPRESS pour mysqli_real_connect fonction.
OriginalL'auteur Devart
Il n'y a pas d'avantages à la compression grande
textes dans une base de données.
Voici les problèmes que vous pourriez rencontrer dans le long terme:
Je pense que le stockage de ces grands textes dans un fichier de disque sera plus facile pour:
OriginalL'auteur ajreal
Vous pouvez utiliser des fonctions php gzdeflate et gzinflate pour le texte.
OriginalL'auteur user447951