Hello semua! Ini adalah artikel pertama saya.
Dalam artikel ini, saya akan memperkenalkan bagaimana pernyataan pertanyaan sql dilaksanakan
Di bawah ialah gambar rajah seni bina MySQL:
Secara amnya, MySQl boleh dibahagikan kepada dua bahagian: pelayan dan lapisan enjin storan.
Lapisan pelayan termasuk penyambung, cache pertanyaan, penghurai, pengoptimum, pelaksana, dsb., dan mengandungi kebanyakan fungsi perkhidmatan teras MySQL, serta semua fungsi binaan (seperti tarikh, masa, matematik dan penyulitan fungsi). Semua ciri enjin storan silang, seperti prosedur tersimpan, pencetus dan paparan dilaksanakan pada lapisan ini.
Lapisan enjin storan bertanggungjawab untuk penyimpanan dan pengambilan data. Seni binanya berasaskan pemalam, menyokong berbilang enjin storan seperti InnoDB, MyISAM, Memory. Dengan menggunakan MySQL 5.5.5, InnoDB menjadi enjin storan lalai untuk MySQL.
Anda boleh menentukan enjin memori wneh mencipta jadual dengan menggunakan kenyataan create table dengan engine=memory.
Enjin storan yang berbeza berkongsi lapisan Pelayan yang sama
Langkah pertama ialah menyambung pangkalan data, yang memerlukan penyambung. Penyambung bertanggungjawab untuk mewujudkan sambungan dengan pelanggan, mendapatkan kebenaran dan menyelenggara dan mengurus sambungan. Perintah sambungan ialah:
mysql -h$ip -P$port -u$user -p
Arahan ini digunakan untuk mewujudkan sambungan dengan pelayan. Selepas melengkapkan jabat tangan TCP klasik, penyambung akan menggunakan nama pengguna dan kata laluan pembekal untuk mengesahkan identiti anda.
Ini bermakna apabila sambungan berjaya diwujudkan, sebarang perubahan yang dibuat oleh pentadbir kepada kebenaran pengguna tidak akan menjejaskan kebenaran sambungan sedia ada. Hanya sambungan baharu akan menggunakan tetapan kebenaran yang dikemas kini.
Selepas sambungan diwujudkan, jika tiada tindakan seterusnya, sambungan memasuki keadaan terbiar, yang boleh dilihat menggunakan arahan show processlist:
Jika pelanggan kekal tidak aktif terlalu lama, penyambung akan terputus secara automatik. Tempoh dikawal oleh parameter tunggu_masa tamat, yang lalai kepada 8 jam.
Jika sambungan ditamatkan dan pelanggan menghantar permintaan, ia akan menerima mesej ralat: Sambungan terputus ke pelayan MySQL semasa pertanyaan. Untuk meneruskan, anda perlu menyambung semula dan kemudian melaksanakan permintaan.
Dalam pangkalan data, sambungan berterusan merujuk kepada sambungan yang pelanggan mengekalkan sambungan yang sama untuk permintaan berterusan selepas berjaya menyambung. Sambungan pendek merujuk kepada memutuskan sambungan selepas beberapa pertanyaan dan menyambung semula untuk pertanyaan seterusnya.
Memandangkan proses sambungan adalah rumit, adalah disyorkan untuk meminimumkan penciptaan sambungan semasa pembangunan, iaitu, gunakan sambungan berterusan apabila boleh.
Walau bagaimanapun, apabila menggunakan sambungan berterusan, penggunaan memori MySQL mungkin meningkat dengan ketara kerana memori sementara yang digunakan semasa pelaksanaan diuruskan dalam objek sambungan. Sumber ini dikeluarkan hanya apabila sambungan ditamatkan. Jika sambungan berterusan terkumpul, ia boleh menyebabkan penggunaan memori yang berlebihan, menyebabkan sistem terpaksa menamatkan MySQL (OOM) secara paksa, mengakibatkan permulaan semula yang tidak dijangka.
Penyelesaian:
Nota: Bermula dari MySQL 8.0, ciri cache pertanyaan telah dialih keluar sepenuhnya kerana kelemahannya mengatasi kelebihannya.
Apabila MySQL menerima permintaan pertanyaan, ia mula-mula menyemak cache pertanyaan untuk melihat sama ada pertanyaan ini telah dilaksanakan sebelum ini. Pertanyaan yang telah dilaksanakan sebelum ini dan keputusannya dicache dalam memori sebagai pasangan nilai kunci. Kuncinya ialah pernyataan pertanyaan, dan nilainya ialah hasilnya. Jika kunci ditemui dalam cache pertanyaan, nilai dikembalikan terus kepada klien.
Jika pertanyaan tidak ditemui dalam cache pertanyaan, proses diteruskan.
Mengapa cache pertanyaan lebih mendatangkan kemudaratan daripada kebaikan?
Penolakan cache pertanyaan berlaku sangat kerap. Sebarang kemas kini pada jadual akan mengosongkan semua cache pertanyaan yang berkaitan dengan jadual itu, menghasilkan kadar hit cache yang sangat rendah, melainkan jadual itu ialah jadual konfigurasi statik.
MySQL menyediakan kaedah "atas permintaan" untuk menggunakan cache pertanyaan. Dengan menetapkan parameter query_cache_type kepada DEMAND, pernyataan SQL tidak akan menggunakan cache pertanyaan secara lalai. Untuk menggunakan cache pertanyaan, anda boleh menentukan secara eksplisit SQL_CACHE:
mysql -h$ip -P$port -u$user -p
Jika cache pertanyaan tidak dipukul, proses pelaksanaan pernyataan bermula. MySQL terlebih dahulu perlu memahami perkara yang perlu dilakukan, jadi ia menghuraikan pernyataan SQL.
Penghurai terlebih dahulu melakukan analisis leksikal. Pernyataan SQL input, yang terdiri daripada rentetan dan ruang, dianalisis oleh MySQL untuk mengenal pasti perkara yang diwakili oleh setiap bahagian. Contohnya, pilih dikenal pasti sebagai pernyataan pertanyaan, T sebagai nama jadual dan ID sebagai lajur.
Selepas analisis leksikal, analisis sintaks dilakukan. Berdasarkan hasil analisis leksikal, penganalisis sintaks menentukan sama ada pernyataan SQL mematuhi peraturan sintaks MySQL.
Jika terdapat ralat sintaks, mesej ralat seperti Anda mempunyai ralat dalam sintaks SQL anda akan dipaparkan. Sebagai contoh, dalam pertanyaan berikut, kata kunci pilihan tersilap ejaan:
select SQL_CACHE * from T where ID=10;
Selepas menghuraikan, MySQL tahu apa yang anda mahu lakukan. Seterusnya, pengoptimum menentukan cara melakukannya.
Pengoptimum menentukan indeks yang hendak digunakan apabila jadual mempunyai berbilang indeks atau susunan jadual bercantum apabila pertanyaan melibatkan berbilang jadual. Contohnya, dalam pertanyaan berikut:
mysql> elect * from t where ID=1; ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'elect * from t where ID=1' at line 1
Pertanyaan boleh bermula dengan mendapatkan semula nilai daripada t1 atau t2. Kedua-dua pendekatan menghasilkan keputusan logik yang sama, tetapi prestasi mereka mungkin berbeza. Peranan pengoptimum ialah memilih pelan yang paling cekap.
Selepas fasa pengoptimuman, proses diteruskan ke pelaksana.
Pelaksana mula melaksanakan pertanyaan.
Sebelum pelaksanaan, ia terlebih dahulu menyemak sama ada sambungan semasa mempunyai kebenaran untuk menanyakan jadual. Jika tidak, ralat yang menunjukkan kebenaran tidak mencukupi dikembalikan. (Semakan kebenaran juga dilakukan apabila mengembalikan hasil daripada cache pertanyaan.)
Jika kebenaran diberikan, jadual dibuka dan pelaksanaan diteruskan. Semasa proses ini, pelaksana berinteraksi dengan enjin storan berdasarkan definisi enjin jadual.
Sebagai contoh, katakan jadual T tidak mempunyai indeks pada lajur ID. Proses pelaksanaan pelaksana adalah seperti berikut:
Pada ketika ini, pertanyaan telah selesai.
Untuk jadual yang diindeks, prosesnya melibatkan penggunaan kaedah pra-takrif enjin untuk mengambil "baris padanan pertama" dan "baris padanan seterusnya" secara berulang.
Dalam log pertanyaan perlahan, medan rows_examined menunjukkan bilangan baris yang diimbas semasa pelaksanaan pertanyaan. Nilai ini terkumpul setiap kali pelaksana memanggil enjin untuk mendapatkan semula baris data.
Dalam sesetengah kes, satu panggilan kepada pelaksana mungkin melibatkan pengimbasan berbilang baris secara dalaman dalam enjin. Oleh itu, bilangan baris yang diimbas oleh enjin tidak semestinya sama baris_diperiksa.
Terima kasih kerana membaca!Saya harap artikel itu dapat membantu anda.
Atas ialah kandungan terperinci Bagaimanakah Pernyataan Pertanyaan SQL dilaksanakan. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!