Rumah > pangkalan data > tutorial mysql > Bagaimanakah Pernyataan Pertanyaan SQL dilaksanakan

Bagaimanakah Pernyataan Pertanyaan SQL dilaksanakan

DDD
Lepaskan: 2025-01-01 05:49:27
asal
910 orang telah melayarinya

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:

How is an SQL Query Statement executed

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

Penyambung

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
Salin selepas log masuk
Salin selepas log masuk

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.

  • Jika nama pengguna atau kata laluan salah, anda akan menerima Akses ditolak kerana ralat pengguna dan program klien akan ditamatkan.
  • Jika pengesahan berjaya, penyambung akan mendapatkan semula kebenaran akaun semasa daripada jadual kebenaran. Semua semakan kebenaran semasa sambungan ini bergantung pada perolehan awal ini.

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:

How is an SQL Query Statement executed

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:

  1. Putuskan sambungan berterusan secara berkala. Selepas menggunakan sambungan untuk seketika atau melaksanakan pertanyaan yang menggunakan memori yang berlebihan, putuskan sambungan dan sambung semula untuk pertanyaan berikutnya.
  2. Jika anda menggunakan MySQL 5.7 atau lebih baru, anda boleh menggunakan mysql_reset_connection selepas melaksanakan operasi intensif sumber untuk memulakan semula sumber sambungan. Proses ini tidak memerlukan penyambungan semula atau pengesahan semula tetapi menetapkan semula sambungan kepada keadaannya yang baru dibuat.

Cache Pertanyaan

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
Salin selepas log masuk
Salin selepas log masuk

Penghurai

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;
Salin selepas log masuk

Pengoptimum

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
Salin selepas log masuk

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

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:

  1. Panggil antara muka enjin InnoDB untuk mengambil baris pertama jadual dan semak sama ada nilai ID ialah 10. Jika tidak, langkaunya; jika ya, tambahkannya pada set hasil.
  2. Panggil antara muka enjin untuk mengambil "baris seterusnya", mengulangi logik yang sama sehingga semua baris ditandakan.
  3. Pelaksana mengembalikan set keputusan terkumpul kepada pelanggan.

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.

tamat

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!

sumber:dev.to
Kenyataan Laman Web ini
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
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan