cari
Rumahpangkalan datatutorial mysql为什么 MySQL 回滚事务也会导致 ibd 文件增大?_MySQL

一个简单的测试: 

 

start transaction;

insert into tb1 values(3, repeat('a', 65000),'x',1);

--commit;

rollback;

 

下图分别是 tb1.ibd 在插入前,回滚前,回滚后的文件大小:

 

有人在QQ群问:为什么回滚会导致tb1.idb的磁盘空间增大?

 

首先:131072-98304=163840-131072=32768

 

这里要存储 65000 个字符'a' ,那么字段类型应该是 text. 而 text 字段的处理是很特别的:

 

Each BLOB or TEXT value is represented internally by a separately allocated object. This is in contrast

to all other data types, for which storage is allocated once per column when the table is opened.

也就是说对于 text/blob 字段来说,它们是另外分配了一个专门的对象来存储,对它们的处理不会在内存中进行缓存,而是直接写入磁盘中。所以未提交时,就可以看到 tb1.idb 发生了增长。

 

而对于 insert 操作的 rollback,那么必须将之前插入的数据进行 delete 操作,而 delete 操作是逻辑操作,也就是设置一个标志位就行了,于是又分配了一个专门的对象来存储这个设置了删除标志的对象。于是磁盘空间增长了两次(暂时只能这么解释了...),每次都是 32768字节(2的15次方)。一旦提交或者rollback,磁盘空间就可以被回收。

 

为什么是 32768呢?

 

text的最大存储空间是 65656 个字节,每次分配的最小单位是 32768字节。

 

也就是 insert 和 rollback 都导致了一次 text 字段磁盘空间的增长分配,而分配的最小单位是32768.

 

如何你将  repeat('a',65000) 换成:  repeat('a',65535) 在进行测试,你会发现,insert 时,tb1.idb会增长65536,在执行rollback时也会导致 tb1.idb 再次增长32768。

 

所以应该是 rollback 会导致 text 字段另外分配一次空间,而分配的最小单位是32768。可能和 text 字段的存储结构有关系。这个需要看源码了。

 

测试表明,其它非 text 字段的 rollback 操作,不会导致 ibd 文件增大。

 

测试建表语句如下:

 

mysql> show create table tb1\G

*************************** 1. row ***************************

       Table: tb1

Create Table: CREATE TABLE `tb1` (

  `id` int(11) NOT NULL AUTO_INCREMENT,

  `webtext` text COLLATE utf8mb4_bin,

  `tp` varchar(2) COLLATE utf8mb4_bin DEFAULT NULL,

  `se` int(11) DEFAULT NULL,

  PRIMARY KEY (`id`)

) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin

1 row in set (0.00 sec)

Kenyataan
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Menambah Pengguna ke MySQL: Tutorial LengkapMenambah Pengguna ke MySQL: Tutorial LengkapMay 12, 2025 am 12:14 AM

Menguasai kaedah menambah pengguna MySQL adalah penting untuk pentadbir pangkalan data dan pemaju kerana ia memastikan keselamatan dan kawalan akses pangkalan data. 1) Buat pengguna baru menggunakan perintah CreateUser, 2) Berikan kebenaran melalui perintah geran, 3) Gunakan flushprivileges untuk memastikan kebenaran berkuatkuasa, 4) kerap mengaudit dan membersihkan akaun pengguna untuk mengekalkan prestasi dan keselamatan.

Menguasai Jenis Data String MySQL: Varchar vs Text vs. CharMenguasai Jenis Data String MySQL: Varchar vs Text vs. CharMay 12, 2025 am 12:12 AM

ChooseCHARforfixed-lengthdata,VARCHARforvariable-lengthdata,andTEXTforlargetextfields.1)CHARisefficientforconsistent-lengthdatalikecodes.2)VARCHARsuitsvariable-lengthdatalikenames,balancingflexibilityandperformance.3)TEXTisidealforlargetextslikeartic

MySQL: Jenis Data String dan Pengindeksan: Amalan TerbaikMySQL: Jenis Data String dan Pengindeksan: Amalan TerbaikMay 12, 2025 am 12:11 AM

Amalan terbaik untuk mengendalikan jenis data rentetan dan indeks dalam MySQL termasuk: 1) Memilih jenis rentetan yang sesuai, seperti char untuk panjang tetap, varchar untuk panjang berubah, dan teks untuk teks besar; 2) berhati-hati dalam pengindeksan, elakkan daripada mengindeks, dan buat indeks untuk pertanyaan umum; 3) Gunakan indeks awalan dan indeks teks penuh untuk mengoptimumkan carian rentetan panjang; 4) Secara kerap memantau dan mengoptimumkan indeks untuk memastikan indeks kecil dan cekap. Melalui kaedah ini, kita dapat mengimbangi membaca dan menulis prestasi dan meningkatkan kecekapan pangkalan data.

Mysql: Cara menambah pengguna dari jauhMysql: Cara menambah pengguna dari jauhMay 12, 2025 am 12:10 AM

Toaddauserremotelytomysql, ikuti: 1) connecttomysqlasroot, 2) createeanewuserwithremoteaccess, 3) grantnessaryaryprivileges, dan4)

Panduan Ultimate untuk Jenis Data String MySQL: Penyimpanan Data CekapPanduan Ultimate untuk Jenis Data String MySQL: Penyimpanan Data CekapMay 12, 2025 am 12:05 AM

TostoreStringsefficientlyinmysql, choosetherightdatypebasedonyonoeds: 1) usecharforfixed-lengtstringslikecountrycodes.2) usevarcharfarfarable-lengtstringslikENAMES.3)

MySQL Blob vs Text: Memilih Jenis Data yang Tepat Untuk Objek BesarMySQL Blob vs Text: Memilih Jenis Data yang Tepat Untuk Objek BesarMay 11, 2025 am 12:13 AM

Apabila memilih jenis gumpalan dan jenis data MySQL, gumpalan sesuai untuk menyimpan data binari, dan teks sesuai untuk menyimpan data teks. 1) Gumpalan sesuai untuk data binari seperti gambar dan audio, 2) Teks sesuai untuk data teks seperti artikel dan komen. Apabila memilih, sifat data dan pengoptimuman prestasi mesti dipertimbangkan.

MySQL: Sekiranya saya menggunakan pengguna root untuk produk saya?MySQL: Sekiranya saya menggunakan pengguna root untuk produk saya?May 11, 2025 am 12:11 AM

Tidak, yoShouldnotusherootuserinmysqlforyourproduct.Instead, createspecificuserswithlimitedprivilegestoenhancesecurityandperformance: 1) createanewuserwithastrongpassword, 2) GrantonLyNessarypermissionStothiser, 3) secara teratur danReviewandupdateerererererword,

Jenis Data String MySQL Diterangkan: Memilih jenis yang sesuai untuk data andaJenis Data String MySQL Diterangkan: Memilih jenis yang sesuai untuk data andaMay 11, 2025 am 12:10 AM

Mysqlstringdatatypesshouldbechosenbasedondatacharacteristicsandusecases: 1) usecharforfixed-lengthstringslikecountrycodes.2) usevarcharfarfarable-lengtstringslikeNames.3) Usebinerorvarbinarbinarbinarbinarsstographceys.2)

See all articles

Alat AI Hot

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

Video Face Swap

Video Face Swap

Tukar muka dalam mana-mana video dengan mudah menggunakan alat tukar muka AI percuma kami!

Artikel Panas

Nordhold: Sistem Fusion, dijelaskan
3 minggu yang laluBy尊渡假赌尊渡假赌尊渡假赌
Mandragora: Whispers of the Witch Tree - Cara Membuka Kunci Cangkuk Bergelut
3 minggu yang laluBy尊渡假赌尊渡假赌尊渡假赌

Alat panas

Dreamweaver CS6

Dreamweaver CS6

Alat pembangunan web visual

Muat turun versi mac editor Atom

Muat turun versi mac editor Atom

Editor sumber terbuka yang paling popular

mPDF

mPDF

mPDF ialah perpustakaan PHP yang boleh menjana fail PDF daripada HTML yang dikodkan UTF-8. Pengarang asal, Ian Back, menulis mPDF untuk mengeluarkan fail PDF "dengan cepat" dari tapak webnya dan mengendalikan bahasa yang berbeza. Ia lebih perlahan dan menghasilkan fail yang lebih besar apabila menggunakan fon Unicode daripada skrip asal seperti HTML2FPDF, tetapi menyokong gaya CSS dsb. dan mempunyai banyak peningkatan. Menyokong hampir semua bahasa, termasuk RTL (Arab dan Ibrani) dan CJK (Cina, Jepun dan Korea). Menyokong elemen peringkat blok bersarang (seperti P, DIV),

Dreamweaver Mac版

Dreamweaver Mac版

Alat pembangunan web visual

Hantar Studio 13.0.1

Hantar Studio 13.0.1

Persekitaran pembangunan bersepadu PHP yang berkuasa