Rumah >pangkalan data >tutorial mysql >Mari analisa bagaimana pernyataan kemas kini MySQL dilaksanakan.

Mari analisa bagaimana pernyataan kemas kini MySQL dilaksanakan.

WBOY
WBOYke hadapan
2022-03-31 12:08:162791semak imbas

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.

Mari analisa bagaimana pernyataan kemas kini MySQL dilaksanakan.

Pembelajaran yang disyorkan: tutorial mysql

Persediaan

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~

Proses pelaksanaan pernyataan SQL

Mari analisa bagaimana pernyataan kemas kini MySQL dilaksanakan.

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.

Pengenalan kepada komponen dalam lapisan pelayan

  • 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

    • Analisis leksikal: Pertama, MySQL akan menghuraikan mengikut pernyataan SQL Penganalisis akan melakukan analisis leksikal SQL yang anda tulis terdiri daripada berbilang rentetan dan ruang pernyataan SQL, MySQL perlu mengenal pasti apakah rentetan di dalamnya dan apa yang diwakilinya.
    • Analisis tatabahasa: Kemudian lakukan analisis tatabahasa Berdasarkan hasil analisis leksikal, penganalisis sintaks akan menentukan sama ada pernyataan SQL yang dimasukkan memenuhi sintaks MySQL berdasarkan peraturan tatabahasa. Jika pernyataan SQL tidak betul, ia akan menggesa: Anda mempunyai ralat dalam suntax SQL anda

  • 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.

Kemas kini analisis pernyataan

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.

buat semula log (buat semula log)

  • Dalam MySQL, jika setiap operasi kemas kini perlu ditulis pada cakera, maka cakera juga mesti mencari yang sepadan Rekod itu kemudiannya dikemas kini, dan kos IO dan kos carian keseluruhan proses adalah sangat tinggi.
    MySQL menggunakan teknologi WAL (log tulis ke hadapan) Nama penuh WAL ialah 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.
  • Log buat semula InnoDB mempunyai saiz tetap Contohnya, ia boleh dikonfigurasikan sebagai satu set 4 fail, setiap fail bersaiz 1GB, jadi sejumlah 4GB operasi boleh direkodkan. Mula menulis dari awal, tulis hingga akhir, kemudian kembali ke permulaan dan tulis dalam gelung.
  • Selepas mendengar pengenalan di atas untuk membuat semula log, rakan boleh bertanya:
,

, redo log日志存储在哪? dan sebagainya. Mari jawab soalan-soalan ini seterusnya. 数据库信息保存在磁盘上,redo log日志也保存在磁盘上,为什么要先写到redo log中再写到数据库中呢?redo log日志如果存满数据了怎么办?

Di manakah log buat semula disimpan?

Enjin InnoDB mula-mula menulis rekod ke log buat semula, ia juga ada pada cakera Ini juga merupakan proses menulis ke cakera, tetapi apa yang berbeza daripada proses kemas kini ialah proses kemas kini Ia adalah IO rawak pada cakera, yang memakan masa. Menulis log buat semula adalah IO berurutan pada cakera. Jadi cekap.

Ruang redo log telah ditetapkan, jadi adakah ia akan kehabisan?

Pertama sekali, jangan risau tentang log buat semula kehabisan ruang, kerana ia

kitar semula

. Sebagai contoh, log log buat semula dikonfigurasikan sebagai satu set 4 fail, setiap fail adalah 1G. Proses menulisnya adalah seperti berikut:
Mari analisa bagaimana pernyataan kemas kini MySQL dilaksanakan.

Ringkasan ringkas:

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.

selamat ranap:

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)

log buat semula ialah log unik kepada enjin innoDB. Binlog ialah log lapisan pelayan mysql.

Malah, log bin muncul lebih awal daripada log buat semula, kerana MySQL tidak mempunyai enjin storan InnoDB pada mulanya, dan ia adalah MyISAM sebelum 5.5. Walau bagaimanapun, MyISAM tidak mempunyai keupayaan selamat ranap dan log binlog hanya boleh digunakan untuk pengarkiban. InnoDB telah diperkenalkan kepada MySQL dalam bentuk pemalam oleh syarikat lain Memandangkan hanya bergantung pada binlog tidak mempunyai keupayaan selamat ranap, InnoDB menggunakan sistem log lain, iaitu, buat semula log, untuk mencapai keupayaan selamat ranap.

redo logbin log的总结

  • redo log是为了保证innoDB引擎的crash-safe能力,也就是说在mysql异常宕机重启的时候,之前提交的事务可以保证不丢失;(因为成功提交的事务肯定是写入了redo log,可以从redo log恢复)
  • bin log是归档日志,将每个更新操作都追加到日志中。这样当需要将日志恢复到某个时间点的时候,就可以根据全量备份+bin log重放实现。 如果没有开启binlog,那么数据只能恢复到全量备份的时间点,而不能恢复到任意时间点。如果连全量备份也没做,mysql宕机,磁盘也坏了,那就很尴尬了。。

redo logbin log的区别:

  • redo log 是 InnoDB 引擎特有的;bin log 是 MySQL 的 Server 层实现的,所有引擎都可以使用。
  • redo log 是物理日志,记录的是“在某个数据页上做了什么修改”;bin log 是逻辑日志,记录的是这个语句的原始逻辑,比如“给 ID=2 这一行的 c 字段加 1 ”。
  • redo log 是循环写的,空间固定会用完;binlog 是可以追加写入的。“追加写”是指 binlog 文件写到一定大小后会切换到下一个,并不会覆盖以前的日志。

InnoDB引擎部分在执行这个简单的update语句的时候的内部流程

update T set c=c+1 where ID=2;

Mari analisa bagaimana pernyataan kemas kini MySQL dilaksanakan.

手动用begin开启事务,然后执行update语句,再然后执行commit语句,那上面的update更新流程之前 哪些是update语句执行之后做的,哪些是commit语句执行之后做的?

事实上,redo log在内存中有一个redo log buffer,binlog 也有一个binlog cache.所以在手动开启的事务中,你执行sql语句,其实是写到redo log bufferbinlog cache中去的(肯定不可能是直接写磁盘日志,一个是性能差一个是回滚的时候不可能去回滚磁盘日志吧),然后当你执行commit的时候,首先要将redo log的提交状态游prepare改为commit状态,然后就要把binlog cache刷新到binlog日志(可能也只是flush到操作系统的page cache,这个就看你的mysql配置),redo log buffer刷新到redo log 日志(刷新时机也是可以配置的)。 如果你回滚的话,就只用把binlog cacheredo log buffer中的数据清除就行了。

在update过程中,mysql突然宕机,会发生什么情况?

  • 如果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!

Kenyataan:
Artikel ini dikembalikan pada:csdn.net. Jika ada pelanggaran, sila hubungi admin@php.cn Padam