Maison > Article > base de données > Comment compresser un stockage de texte volumineux dans MySQL
Comme mentionné précédemment, le contenu de l'instantané de notre projet de document cloud est stocké directement dans la base de données, qui est un grand stockage de texte. La plupart des champs de contenu de l'instantané du document sont au niveau du Ko, et certains sont même au niveau du Ko. Niveau Mo. À l'heure actuelle, l'optimisation de la mise en cache CDN a été effectuée pour la lecture des données (outil de mise en cache des ressources statiques - CDN) L'écriture et le stockage des données doivent encore être optimisés. Si certains algorithmes de compression peuvent être utilisés pour compresser et stocker du texte volumineux, vous pouvez le faire. Économisez considérablement l'espace de stockage de la base de données et soulagez la pression des E/S de la base de données.
select table_name as '表名', table_rows as '记录数', truncate(data_length/1024/1024, 2) as '数据容量(MB)', truncate(index_length/1024/1024, 2) as '索引容量(MB)', truncate(DATA_FREE/1024/1024, 2) as '碎片占用(MB)' from information_schema.tables where table_schema=${数据库名} order by data_length desc, index_length desc;
Nous savons tous que la taille de bloc de page par défaut d'innodb est de 16 Ko. Si la longueur des données d'une ligne dans le tableau dépasse 16 Ko, un débordement de ligne se produira et la ligne débordée est stockée à un autre endroit (décompression de la page blob). Étant donné qu'Innodb utilise un index clusterisé pour stocker les données, c'est-à-dire une structure B+Tree, il y a au moins deux lignes de données dans chaque bloc de page, sinon la signification de B+Tree sera perdue, donc la limite de longueur maximale d'une ligne de les données obtenues sont de 8 Ko (le grand champ stockera 768 octets de données dans la page de données, et les données restantes déborderont vers une autre page. La page de données dispose également de 20 octets pour enregistrer l'adresse de la page de débordement)
La partie trou du fichier n'occupe pas d'espace disque et l'espace disque occupé par le fichier est toujours continu
est applicable Scénario : en raison de la grande quantité de données et de l'espace disque insuffisant, la charge se reflète principalement dans les E/S et le processeur du serveur a une marge relativement importante .
Documents associés : dev.mysql.com/doc/refman/…
Documents associés : dev.mysql.com/doc/ refman/…
trous
Fonctionnalité) 空洞
特性)ALTER TABLE xxx COMPRESSION = ZLIB
可以启用TPC页压缩功能,但这只是对后续增量数据进行压缩,如果期望对整个表进行压缩,则需要执行 OPTIMIZE TABLE xxx
实现过程:一个压缩页在缓冲池中都是一个16K的非压缩页,只有在数据刷盘的时候,会进行一次压缩,压缩后剩余的空间会用 0x00 填满,利用文件系统的空洞特性(hole punch)对文件进行裁剪,释放 0x00 占用的稀疏空间
MySQL目前没有直接针对列压缩的方案,有一个曲线救国的方法,就是在业务层使用MySQL提供的压缩和解压函数来针对列进行压缩和解压操作。也就是如果需要对某一列做压缩,在写入时调用COMPRESS
函数对那个列的内容进行压缩,读取的时候,使用UNCOMPRESS
函数对压缩过的数据进行解压。
COMPRESS()
UNCOMPRESS()
LENGTH()
UNCOMPRESSED_LENGTH()
insert into xxx (content) values (compress('xxx....'))
读取压缩的数据:select c_id, uncompressed_length(c_content) uncompress_len, length(c_content) compress_len from xxx
ALTER TABLE xxx COMPRESSION = ZLIB
Vous pouvez activer la fonction de compression de page TPC, mais cela ne compresse que les données incrémentielles suivantes si vous le faites. Si vous prévoyez compresser la table entière, vous devez exécuter OPTIMIZE TABLE xxx
COMPRESS
pour compresser le contenu de cette colonne lors de l'écriture et utilisez la fonction UNCOMPRESS
pour compresser le contenu compressé. lors de la lecture. Les données sont décompressées. 🎜🎜🎜Scénario d'utilisation : pour la situation où la longueur des données de certaines colonnes du tableau est relativement grande, généralement varchar, text, blob, json et d'autres types de données🎜🎜Fonctions associées : 🎜🎜Fonction de compression : COMPRESS( )
🎜🎜Fonction de décompression : UNCOMPRESS()
🎜🎜Fonction de longueur de chaîne : LENGTH()
🎜🎜Fonction de longueur de chaîne non compressée : UNCOMPRESSED_LENGTH()🎜🎜🎜🎜Test : 🎜🎜Insérer des données : <code>insérer dans les valeurs xxx (contenu) (compress('xxx....'))
🎜🎜🎜Lire les données compressées : sélectionnez c_id, uncompressed_length(c_content) uncompress_len, length(c_content) compress_len de xxx🎜🎜🎜🎜🎜🎜
🎜🎜SELECT NAME, FS_BLOCK_SIZE, FILE_SIZE, ALLOCATED_SIZE FROM information_schema.INNODB_TABLESPACES WHERE NAME like 'test_compress%';
FS_BLOCK_SIZE
:文件系统块大小,也就是打孔使用的单位大小FILE_SIZE
:文件的表观大小,表示文件的最大大小,未压缩ALLOCATED_SIZE
:文件的实际大小,即磁盘上分配的空间量压缩率:
【相关推荐:mysql视频教程】
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!