Artikel ini membawa anda pengetahuan yang berkaitan tentang mysql Ia terutamanya memperkenalkan isu berkaitan tentang cara penyataan kemas kini dilaksanakan Apabila melaksanakan operasi kemas kini, cache pertanyaan yang berkaitan dengan jadual akan menjadi tidak sah. jadi kenyataan itu akan mengosongkan semua hasil tembolok di atas meja Mari kita lihat bersama-sama. Saya harap ia akan membantu semua orang.
Pembelajaran yang disyorkan: tutorial mysql
Mula-mula buat jadual, dan kemudian masukkan tiga keping data :
CREATE TABLE T( ID int(11) NOT NULL AUTO_INCREMENT, c int(11) NOT NULL, PRIMARY KEY (ID)) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='测试表';INSERT INTO T(c) VALUES (1), (2), (3);
Mari kita lakukan operasi kemas kini:
update T set c=c+1 where ID=2;
Sebelum bercakap tentang operasi kemas kini, mari kita lihat proses pelaksanaan pernyataan sql dalam MySQL~
Seperti yang ditunjukkan dalam rajah: Pangkalan data MySQL terutamanya dibahagikan kepada dua peringkat: Lapisan perkhidmatan dan Lapisan enjin storan Lapisan perkhidmatan : Lapisan pelayan termasuk penyambung, cache pertanyaan, penganalisis, pengoptimum dan pelaksana, termasuk kebanyakan fungsi teras dalam MySQL Semua fungsi enjin storan silang turut dilaksanakan dalam lapisan ini, termasuk disimpan prosedur dan pencetus Objek, pandangan, dsb. Lapisan enjin storan: Lapisan enjin storan termasuk enjin storan MySQL biasa, termasuk MyISAM, InnoDB dan Memory Yang paling biasa digunakan ialah InnoDB, yang juga merupakan enjin storan lalai MySQL.
Penyambung: Log masuk klien MySQL diperlukan dan penyambung diperlukan. Sambungkan pengguna ke pangkalan data MySQL, "mysql -u username -p password" untuk log masuk ke MySQL Selepas melengkapkan jabat tangan TCP, penyambung akan mengesahkan identiti log masuk berdasarkan nama pengguna dan kata laluan yang dimasukkan.
Cache pertanyaan: Selepas menerima permintaan pelaksanaan, MySQL akan terlebih dahulu mencari dalam cache pertanyaan untuk melihat sama ada pernyataan SQL ini telah dilaksanakan dan sama ada pernyataan itu telah dilaksanakan sebelum ini Dan hasilnya akan diletakkan dalam ingatan dalam bentuk pasangan kunci-nilai. Kuncinya ialah pernyataan pertanyaan, dan nilainya ialah hasil pertanyaan. Jika pernyataan SQL ini boleh ditemui melalui kunci, hasil pelaksanaan SQL akan dikembalikan secara langsung. Jika ia tidak wujud dalam cache, fasa pelaksanaan seterusnya akan diteruskan. Selepas pelaksanaan selesai, hasil pelaksanaan akan diletakkan dalam cache pertanyaan. Kelebihannya ialah kecekapan tinggi. Walau bagaimanapun, penggunaan cache pertanyaan tidak disyorkan, kerana jika jadual tertentu dikemas kini dalam MySQL, semua cache pertanyaan akan menjadi tidak sah Untuk pangkalan data yang kerap dikemas kini, kadar hit cache pertanyaan adalah sangat rendah. Nota: Dalam MySQL versi 8.0, fungsi cache pertanyaan telah dipadamkan, dan tiada fungsi cache pertanyaan
Penganalisis: dibahagikan kepada analisis leksikal dan Analisis tatabahasa
Pengoptimum: Selepas penganalisis Selepas analisis, SQL adalah sah, tetapi sebelum pelaksanaan, ia perlu diproses oleh pengoptimum Pengoptimum akan menentukan indeks yang hendak digunakan dan sambungan mana yang hendak digunakan Peranan pengoptimum adalah untuk menentukan pelan pelaksanaan yang paling cekap.
Pelaksana: Dalam fasa pelaksanaan, MySQL akan terlebih dahulu menentukan sama ada terdapat kebenaran untuk melaksanakan pernyataan Jika tiada kebenaran, ia akan mengembalikan ralat tiada kebenaran; jika ada kebenaran, Buka sahaja jadual dan teruskan pelaksanaan. Apabila jadual dibuka, pelaksana akan menggunakan antara muka yang disediakan oleh enjin sasaran mengikut definisi enjin Bagi jadual dengan indeks, logik pelaksanaan adalah serupa.
Setelah memahami proses pelaksanaan pernyataan SQL, mari analisa secara terperinci bagaimana update T set c=c 1 where ID=2;
di atas dilaksanakan.
update T set c=c+1 where ID=2;
Apabila melaksanakan operasi kemas kini, cache pertanyaan yang berkaitan dengan jadual ini akan menjadi tidak sah, jadi pernyataan ini Semua hasil cache di atas meja T akan dikosongkan. Seterusnya, penganalisis akan melalui analisis sintaks dan analisis leksikal Selepas mengetahui bahawa ini adalah penyataan kemas kini, pengoptimum memutuskan indeks yang hendak digunakan, dan kemudian pelaksana bertanggungjawab untuk pelaksanaan khusus itu mula-mula mencari baris ini dan kemudian mengemas kininya .
Menurut pemikiran biasa kami, adalah untuk mencari rekod ini, menukar nilainya dan menyimpannya . Tetapi mari kita gali butirannya Memandangkan ia melibatkan pengubahsuaian data, ia melibatkan log. Operasi kemas kini melibatkan dua modul log penting. redo log(重做日志)
, bin log(归档日志)
. Kedua-dua log dalam MySQL ini juga mesti dipelajari.
Write-Ahead Logging
Perkara utamanya ialah menulis log dahulu dan kemudian menulis pada cakera . Secara khusus, apabila rekod perlu dikemas kini, enjin InnoDB akan menulis rekod itu ke log buat semula dan mengemas kini memori Pada masa ini, kemas kini selesai. Pada masa yang sama, enjin InnoDB akan mengemas kini rekod operasi ke cakera pada masa yang sesuai, dan kemas kini ini sering dilakukan apabila sistem agak melahu. , redo log日志存储在哪?
dan sebagainya. Mari jawab soalan-soalan ini seterusnya. 数据库信息保存在磁盘上,redo log日志也保存在磁盘上,为什么要先写到redo log中再写到数据库中呢?
redo log日志如果存满数据了怎么办?
. Sebagai contoh, log log buat semula dikonfigurasikan sebagai satu set 4 fail, setiap fail adalah 1G. Proses menulisnya adalah seperti berikut:
Ringkasan ringkas:selamat ranap:redo log ialah mekanisme unik enjin storan Innodb, yang boleh digunakan untuk berurusan dengan Pemulihan yang tidak normal , Crash-safe, buat semula boleh memastikan bahawa apabila mysql dimulakan semula secara tidak normal, urus niaga tanpa komitmen akan ditarik balik dan transaksi yang diserahkan selamat dimasukkan ke dalam pangkalan data.
Dengan log buat semula, InnoDB boleh memastikan bahawa walaupun pangkalan data dimulakan semula secara tidak normal, rekod yang diserahkan sebelum ini tidak akan hilang.
binlog (log arkib)redo log
和bin log
的总结redo log
和bin log
的区别:update T set c=c+1 where ID=2;
手动用begin开启事务,然后执行update语句,再然后执行commit语句,那上面的update更新流程之前 哪些是update语句执行之后做的,哪些是commit语句执行之后做的?
事实上,redo log在内存中有一个
redo log buffer
,binlog 也有一个binlog cache
.所以在手动开启的事务中,你执行sql语句,其实是写到redo log buffer
和binlog cache
中去的(肯定不可能是直接写磁盘日志,一个是性能差一个是回滚的时候不可能去回滚磁盘日志吧),然后当你执行commit的时候,首先要将redo log的提交状态游prepare改为commit状态,然后就要把binlog cache
刷新到binlog日志(可能也只是flush到操作系统的page cache,这个就看你的mysql配置),redo log buffer
刷新到redo log 日志(刷新时机也是可以配置的)。 如果你回滚的话,就只用把binlog cache
和redo log buffer
中的数据清除就行了。
如果redolog写入了,处于prepare状态,binlog还没写入,那么宕机重启后,redolog中的这个事务就直接回滚了。
如果redolog写入了,binlog也写入了,但redolog还没有更新为commit状态,那么宕机重启以后,mysql会去检查对应事务在binlog中是否完整。如果是,就提交事务;如果不是,就回滚事务。 (redolog处于prepare状态,binlog完整启动时就提交事务,为啥要这么设计? 主要是因为binlog写入了,那么就会被从库或者用这个binlog恢复出来的库使用,为了数据一致性就采用了这个策略)
redo log和binlog是通过xid这个字段关联起来的。
推荐学习:mysql教程
Atas ialah kandungan terperinci Mari analisa bagaimana pernyataan kemas kini MySQL dilaksanakan.. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!