Sontinue untuk berkongsi dengan anda, saya pergi ke Shanghai Meituan untuk temu bual dan menghadapi masalah teknikal katakan ia buruk atau baik, ia tidak memberikan perasaan yang menyenangkan kepada penemuduga.
Memang teruk, ia sama dengan banyak perkara, saya biasanya berasa sihat, tetapi apabila tiba masa untuk temuduga, saya tidak dapat memikirkan apa-apa. . dan lain-lain. ( Kerana ini semua soalan temuduga yang saya jumpa dalam talian dan hafal).
Hari ini kita akan bercakap tentang MySQL
sistem seni bina, walaupun kami adalah Java
Pembangun, tetapi mereka sering berurusan dengan pangkalan data MySQL dalam proses pembangunan harian. Jika syarikat mempunyai );font-family: "Operator Mono", Consolas, Monaco, Menlo, monospace;word-break: break-all;color: rgb(239, 112, 96);">DBA boleh lakukan banyak tetapi masih sedikit Lebih baik, jika tiada DBA
atauDBA ialah daripada tiada guna, kami masih sangat Perlu memahamiMySQL Keseluruhan sistem
, Selain itu, bertemu dengannya semasa temu duga juga merupakan satu kelebihan. MySQL
的架构体系,尽管咱们是Java
开发人员,但是在日常开发过程中也会经常和MySQL数据库打交道。如果公司有DBA
能干点事还稍微好点,如果是没有DBA
或者DBA
没什么用的情况下,我们还是很有必要了解MySQL
的整个体系的,况且在面试中遇到了也是一个加分项。
想要知道一条SQL
是怎么查询的,只要对MySQL
整个体系搞清楚了,才能说出个123。
所以于情于理,我们很有必要学习一下MySQL
的架构体系的。
平时,我和小伙伴们聊天的时候,经常会把MySQL
Cara SQL
disoal, cuma MySQL
Hanya apabila keseluruhan sistem difahami kita boleh menyebut 123. 🎜🎜🎜Jadi adalah perlu untuk kita belajar tentang emosi dan sebabMySQL
arkitektur. 🎜🎜Biasanya, apabila saya berbual dengan rakan saya, saya sering menggunakan MySQL
ialah sistem perisian yang kami bangunkan Memandangkan ia adalah sistem perisian, terdapat gambar rajah seni bina, bagaimana seni bina berlapis dan apakah fungsi setiap lapisan. 🎜
MySQL
ialah Sistem pengurusan pangkalan data hubungan yang dibangunkan oleh Sweden , 31, 35, 0.05);font-family: "Operator Mono", Consolas, Monaco, Menlo, monospace;word-break: break-all;color: rgb(239, 112, 96 );">MySQL AB code>Dibangunkan oleh syarikat, ia kini dimiliki oleh Oracle
Syarikat . MySQL
是一个关系型数据库管理系统,由瑞典MySQL AB
公司开发,目前属于Oracle
公司。MySQL
是一种关联数据库管理系统,将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。MySQL
是开源的,所以你不需要支付额外的费用。MySQL
支持大型的数据库,可以处理拥有上千万条记录的大型数据库。MySQL
使用标准的SQL数据语言形式。MySQL
可以允许于多个系统上,并且支持多种语言,这些编程语言包括C、C++、Python、Java、Ped、PHP、Eifel、Ruby和TCL等。MySQL
🎜MySQL Code> ialah sistem pengurusan pangkalan data hubungan yang menyimpan data dalam jadual yang berbeza dan bukannya meletakkan semua data dalam satu gudang besar, yang meningkatkan kelajuan dan meningkatkan fleksibiliti.
MySQL Kod> adalah sumber terbuka, jadi anda tidak perlu membayar tambahan. 🎜🎜<code style="font-size: 14px;padding: 2px 4px;border-radius: 4px;margin-right: 2px;margin-left: 2px;background-color: rgba( 27, 31, 35, 0.05);font-family: " operator mono consolas monaco menlo monospace break-all rgb>MySQL code> menyokong pangkalan data yang besar dan boleh mengendalikan pangkalan data yang besar dengan berpuluh juta rekod. 🎜🎜<code style="font-size: 14px;padding: 2px 4px;border-radius: 4px;margin-right: 2px;margin-left: 2px;background-color: rgba( 27, 31, 35, 0.05);font-family: " operator mono consolas monaco menlo monospace break-all rgb>MySQL kod>Menggunakan borang bahasa data SQL standard. 🎜🎜<code style="font-size: 14px;padding: 2px 4px;border-radius: 4px;margin-right: 2px;margin-left: 2px;background-color: rgba( 27, 31, 35, 0.05);font-family: " operator mono consolas monaco menlo monospace break-all rgb>MySQL code> boleh digunakan pada berbilang sistem dan menyokong pelbagai bahasa ini termasuk C, C++, Python, Java, Ped, PHP, Eifel, Ruby dan TCL, dsb. 🎜🎜<code style="font-size: 14px;padding: 2px 4px;border-radius: 4px;margin-right: 2px;margin-left: 2px;background-color: rgba( 27, 31, 35, 0.05);font-family: " operator mono consolas monaco menlo monospace break-all rgb>MySQL code> mempunyai sokongan yang baik untuk PHP, yang kini merupakan bahasa pembangunan web yang paling popular.<li><section style="margin-top: 5px;margin-bottom: 5px;line-height: 26px;color: rgb(1, 1, 1);"><code style="font-size: 14px;padding: 2px 4px;border-radius: 4px;margin-right: 2px;margin-left: 2px;background-color: rgba(27, 31, 35, 0.05);font-family: " operator mono consolas monaco menlo monospace break-all rgb>MySQL
menyokong pangkalan data yang besar, Menyokong gudang data 50 juta rekod Fail jadual sistem 32-bit boleh menyokong maksimum 4GB, dan sistem 64-bit menyokong fail jadual maksimum 8TB. MySQL
支持大型数据库,支持5000万条记录的数据仓库,32位系统表文件最大可支持4GB,64位系统支持最大的表文件为8TB。
MySQL
是可以定制的,采用了GPL协议,你可以修改源码来开发自己的MySQL
系统。请注意
MySQL
拼写,另外,很多人可能有疑问,为什么MySQL
的logo是一条海豚?
下面我们就来看看MySQL
的整体架构图。
再来看看我们开发的系统架构图:
其实还是蛮相似的,都有分层的概念。既然我们开发的软件系统能进行分层,那么MySQL
MySQL
boleh disesuaikan , menggunakan protokol GPL, anda boleh mengubah suai kod sumber untuk membangunkan MySQL
sistem. 🎜🎜Sila ambil perhatian
MySQL
ejaan, di samping itu, ramai orang mungkin mempunyai soalan, mengapaLogo MySQL
adalah ikan lumba-lumba? 🎜
Mari kita lihatMySQL
Gambar rajah seni bina keseluruhan. 🎜
Mari kita lihat gambar rajah seni bina sistem yang kami bangunkan: 🎜
Sebenarnya, ianya agak serupa konsep pelapisan. Memandangkan sistem perisian yang kami bangunkan boleh berlapis, maka MySQL Bolehkah ia berlapis? 🎜<p data-tool="mdnice编辑器" style="padding-top: 8px;padding-bottom: 8px;line-height: 26px;margin-top: 1px;margin-bottom: 1px;">Jawapannya ialah: Ya, mari kita bincangkannya di bawah<code style="font-size: 14px;padding: 2px 4px;border-radius: 4px;margin-right: 2px;margin-left: 2px;background-color: rgba(27, 31, 35, 0.05);font-family: " operator mono consolas monaco menlo monospace break-all rgb>MySQL
Situasi lapisan dan fungsi setiap lapisan. MySQL
的分层情况以及每一层的功能。
上面的架构图我们可以对其进行拆分,并做简要的说明。
与客户端打交道,上面已经写明了能支持的的语言。客户端的链接支持的协议很多,比如我们在 Java
开发中的 JDBC
。
这一层是不是有点像我们项目中的网关层
?如果对网关不熟悉,那我们可以理解我controller
JDBC
. lapisan pengawal
. Lapisan perkhidmatan🎜🎜🎜🎜🎜🎜🎜🎜Lapisan ini bersamaan dengan lapisan perkhidmatan dalam sistem perniagaan kami, satu hodgepodge operasi perniagaan yang berkaitan, pengoptimuman kod semuanya ada di dalamnya, dll. 🎜🎜🎜🎜Kolam sambungan🎜🎜🎜🎜 bertanggungjawab terutamanya untuk menyimpan dan mengurus sambungan antara pelanggan dan pangkalan data, dan satu utas bertanggungjawab untuk menguruskan satu sambungan. Sejak pengenalan kumpulan sambungan, laporan rasmi: Apabila bilangan sambungan pangkalan data mencecah 128, prestasi menggunakan kumpulan sambungan dan tanpa kumpulan sambungan dipertingkatkan sebanyak n kali (walaupun begitu, prestasi bertambah baik). 🎜Selepas sambungan diwujudkan, anda boleh melaksanakan penyataan pilih. Logik pelaksanaan akan mula-mula datang ke modul cache.
Selepas MySQL mendapat permintaan pertanyaan, ia akan pergi ke cache pertanyaan terlebih dahulu untuk melihat sama ada pernyataan ini telah dilaksanakan sebelum ini. Pernyataan yang dilaksanakan sebelum ini dan keputusannya disimpan dalam ingatan dalam bentuk pasangan nilai kunci. Kuncinya ialah pernyataan pertanyaan, dan nilainya ialah hasil pertanyaan. Jika pertanyaan anda boleh mencari kunci terus dalam cache ini (tekan), maka nilai akan dikembalikan terus kepada klien.
Jika terdapat kesilapan dalam cache, fasa pelaksanaan seterusnya akan diteruskan. Selepas pelaksanaan selesai, hasil pelaksanaan akan disimpan dalam cache pertanyaan. Seperti yang anda lihat di sini, jika pertanyaan mencecah cache, MySQL boleh terus mengembalikan hasilnya tanpa melakukan operasi kompleks berikutnya, yang sangat cekap.
Tetapi dalam kebanyakan kes, saya akan mengesyorkan anda untuk tidak menggunakan caching pertanyaan, mengapa? Kerana caching pertanyaan selalunya mendatangkan lebih banyak kemudaratan daripada kebaikan.
Cache pertanyaan sangat kerap gagal selagi sekeping data tertentu dalam jadual dikemas kini, semua cache pertanyaan pada jadual ini akan dikosongkan.
Jadi, anda mungkin mengalami kesukaran untuk menyimpan keputusan, tetapi sebelum anda menggunakannya, keputusan itu akan dibersihkan dengan kemas kini. Untuk pangkalan data dengan tekanan kemas kini yang berat, kadar hit bagi cache pertanyaan akan menjadi sangat rendah. Melainkan perniagaan anda mempunyai jadual statik, ia hanya akan dikemas kini sekali untuk masa yang lama.
Contohnya: jadual konfigurasi sistem, maka pertanyaan pada jadual ini sesuai untuk cache pertanyaan.
Nasib baik MySQL
juga menyediakan A " ini gunakan pendekatan yang diperlukan". Anda boleh menetapkan parameter query_cache_type
ditetapkan kepada DEMAND
, supaya pernyataan SQL lalai adalah tidak digunakan Cache pertanyaan. MySQL
也提供了这种“按需使用”的方式。你可以将参数query_cache_type
设置成DEMAND
,这样对于默认的SQL语句都不使用查询缓存。
「注意」:MySQL 8.0
Versi MySQL 8.0
secara langsung memadamkan keseluruhan fungsi cache pertanyaan, yang menandakan bahawa MySQL 8.0 telah menghapuskan fungsi cache sepenuhnya. Selepas selesai analisis leksikal, anda perlu melakukan "analisis tatabahasa". Berdasarkan hasil analisis leksikal, penganalisis sintaks akan menentukan sama ada pernyataan SQL yang anda masukkan memenuhi sintaks MySQL berdasarkan peraturan tatabahasa.
Jika kami terlepas atau menulis huruf yang salah semasa mengeja SQL, kami akan menerima peringatan ralat "You have an error in your SQL syntax
".
Sebagai contoh, dalam kes berikut:
Ralatnya ialah terdapat E yang hilang dalam kata kunci WHERE.
Begitu juga, kami menggunakan SQL jika medan tidak wujud.
Secara amnya, ralat tatabahasa akan menggesa lokasi pertama di mana ralat itu berlaku, jadi anda harus memberi perhatian kepada kandungan serta-merta selepas "use near". .
SQL telah dianalisis oleh penganalisis dan tiada ralat dilaporkan. Kemudian masukkan pengoptimum pada masa ini untuk mengoptimumkan SQL.
Pengoptimum digunakan terutamanya untuk menentukan indeks yang hendak digunakan jika terdapat berbilang indeks dalam jadual pangkalan data kami atau apabila penyata mempunyai berbilang perkaitan jadual (bergabung), Tentukan susunan gabungan setiap jadual.
Contohnya:
SELECT a.id, b.id FROM t_user a join t_user_detail b WHERE a.id=b.user_id and a.user_name='田维常' and b.id=10001
Ia akan mengoptimumkan pertanyaan bersyarat.
Selepas pemprosesan pengoptimum selesai, pelan pelaksanaan SQL telah ditentukan. Kemudian teruskan ke dalam penggerak.
Pertama sekali, anda mesti menentukan kebenaran, iaitu sama ada anda mempunyai kebenaran untuk melaksanakan SQL ini. Kebenaran mungkin dikawal pada sesetengah pelanggan semasa bekerja.
Contohnya: Dalam persekitaran pengeluaran, kebanyakan pembangun hanya mempunyai kebenaran pertanyaan dan tiada kebenaran untuk menambah, memadam atau mengubah suai (kecuali beberapa syarikat kecil).
Jika anda mempunyai kebenaran, buka jadual dan teruskan pelaksanaan. Apabila jadual dibuka, pelaksana akan menggunakan antara muka yang disediakan oleh enjin berdasarkan definisi enjin jadual.
Lapisan ini boleh difahami sebagai lapisan kegigihan dalam sistem perniagaan kami.
Konsep enjin storan adalah unik untuk MySQL Tidak semua pangkalan data hubungan mempunyai konsep enjin storan.
Enjin storan pangkalan data ialah organisasi perisian asas bagi pangkalan data Sistem pengurusan pangkalan data (DBMS) menggunakan enjin data untuk mencipta, membuat pertanyaan, mengemas kini dan memadam data. Enjin storan yang berbeza menyediakan mekanisme storan yang berbeza, teknik pengindeksan, tahap penguncian dan fungsi lain Menggunakan enjin storan yang berbeza, anda juga boleh mendapatkan fungsi tertentu. Banyak sistem pengurusan pangkalan data yang berbeza hari ini menyokong pelbagai enjin data yang berbeza.
Oleh kerana data disimpan dalam bentuk jadual dalam pangkalan data hubungan, enjin storan juga boleh dipanggil jenis jadual (Jenis Jadual, iaitu jenis penyimpanan dan operasi jadual ini).
Berikut ialah perbandingan beberapa enjin yang agak biasa digunakan:
Dalam projek sebenar, kebanyakan menggunakan InnoDB, kemudian MyISAM, dan enjin storan lain digunakan sekurang-kurangnya.
Kita boleh menggunakan arahan untuk melihat enjin storan yang disediakan MySQL:
show engies;
Kami juga boleh menggunakan arahan untuk melihat enjin storan lalai semasa MySQL:
tunjukkan pembolehubah seperti '%storage_engine%';
MyISAM
dan InnoDB
MyISAM
与 InnoDB
引擎的区别MySQL
Enjin storan InnoDB terutamanya mempunyai ciri-ciri berikut:
Menyokong urus niaga
pengasingan transaksi
Sokongan Bacaan berbilang versi
menyokong kunci peringkat baris
Sekatan baca dan tulis berkaitan dengan tahap pengasingan transaksi
🎜Menyokong caching, yang boleh cache kedua-dua indeks dan data
Seluruh jadual dan kunci utama disimpan dalam mod Kluster untuk membentuk pokok yang seimbang
MyIASM (enjin ini ialah enjin storan lalai dalam pangkalan data MySQL sebelum 5.5) Ciri-ciri:
Tidak disokong Row -kunci tahap dan kunci asing
Disebabkan oleh 2, apabila melaksanakan sisipan INSERT atau kenyataan kemas kini KEMASKINI, iaitu, semasa melakukan operasi tulis, seluruh jadual perlu dikunci, jadi kecekapan akan menjadi dikurangkan
MyISAM menyimpan bilangan baris dalam jadual Apabila melaksanakan
, nilai yang berkaitan boleh dibaca terus tanpa mengimbas keseluruhan jadual. SELECT COUNT(*) FROM TABLE
Perbezaan antara keduanya:
MyISAM selamat berurus niaga ialah tahap jadual, dan InnoDB menyokong peringkat baris kunci
MyISAM menyokong indeks teks penuh, manakala InnoDB tidak menyokong indeks teks penuh sebelum MySQL5.6 Ia menyokong indeks FULLTEXT bermula dari MySQL5.6.
Perbandingan senario penggunaan:
Jika anda ingin melakukan sejumlah besar operasi terpilih, anda harus memilih MyISAM
Lapisan storan fail sistem
"frm file"
: Maklumat metadata yang disimpan di tepi, termasuk maklumat definisi struktur jadual, dsb. Setiap jadual akan mempunyai fail frm yang sepadan dengannya."Fail MYD"
: Fail khusus untuk enjin storan MyISAM, yang menyimpan maklumat data jadual MyISAM Setiap jadual MyISAM mempunyai fail .MYD.「MYI文件」:也是MyISAM存储引擎专用的文件,存放MyISAM表的索引相关信息,每一张MyISAM表都有对应的.MYI文件。
「ibd文件和ibdata文件」:存放InnoDB的数据文件(包括索引)。InnoDB存储引擎有两种表空间方式:独立表空间和共享表空间。
「ibdata1文件」:系统表空间数据文件,存储表元数据、Undo日志等。
「ib_logfile0、ib_logfile0文件」:Redo log日志文件。
错误日志:默认是开启状态,可以通过命令查看:
show variables like '%log_error%';
二进制日志binary log:记录了对MySQL数据库执行的更改操作,并且记录了语句的发生时间、执行耗时;但是不记录查询select、show等不修改数据的SQL。主要用于数据库恢复和数据库主从复制。也是大家常说的binlog日志。
show variables like '%log_log%';//查看是否开启binlog日志记录。 show variables like '%binllog%';//查看参数 show binary logs;//查看日志文件
慢查询日志:记录查询数据库超时的所有SQL,默认是10秒。
show variables like '%slow_query%';//查看是否开启慢查询日志记录。 show variables '%long_query_time%';//查看时长
通用查询日志:记录一般查询语句;
show variables like '%general%';
用于存放MySQL所有的配置信息的文件,比如:my.cnf、my.ini等。
「pid文件」
pid文件是mysqld应用程序在Linux或者Unix操作系统下的一个进程文件,和许多其他Linux或者Unix服务端程序一样,该文件放着自己的进程id。
「socket文件」
socket文件也是Linux和Unix操作系统下才有的,用户在Linux和Unix操作系统下客户端连接可以不通过TCP/IP网络而直接使用Unix socket来连接MySQL数据库。
SQL查询流程图
. warna latar belakang: rgba(27, 31, 35, 0.05); keluarga fon: "Operator Mono", Consolas, Monaco, Menlo, monospace;patah perkataan: pecah-semua;warna: rgb(239, 112, 96) ;">MySQL Kita boleh menganggap keseluruhan sistem sebagai sistem perisian yang kita bangunkan setiap hari. Ia juga mempunyai lapisan akses, yang direka khusus untuk menyambung kepada pelanggan luaran. Ia sangat serupa dengan pintu masuk sistem kami , dan cache adalah serupa dengan kod perniagaan kami Cache dan parser yang digunakan boleh difahami sebagai penghuraian parameter dan pengesahan parameter dalam sistem perniagaan Lapisan pengoptimuman boleh digunakan sebagai cara untuk mengoptimumkan pembangunan kod kami enjin adalah bersamaan dengan lapisan kegigihan kami, dan sistem fail bersamaan dengan keseluruhan sistem perniagaan.MySQL
整个系统我们可以看成是我们日常开发的软件系统,也有接入层,专门对接外面客户端的,和我们系统的网关就很像,缓存也就类似我们业务代码中使用的缓存,解析器可以理解为业务系统中参数解析以及参数校验,优化层可以当做我们开发代码优化的手段,然后存储引擎就相当于我们的持久层,文件系统相当于整个业务系统中的数据库。
可能比喻不是非常的恰当,但是希望大家能领略轻重的含义,目的只有一个,那就是让大家能轻松掌握MySQL
Bacaan yang disyorkan
Jika anda tidak bergerak, saya tidak akan bergerak---Mod pemerhati
Ringkasan wawancara dengan 4 syarikat dalam 10 hari selepas peletakan jawatan
Atas ialah kandungan terperinci Penemuduga Meituan: Terangkan dengan jelas sistem struktur MySQL dan buat tawaran dengan segera. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!