Rumah >pembangunan bahagian belakang >tutorial php >Menggunakan Jelaskan untuk Menulis Pertanyaan MySQL yang Lebih Baik

Menggunakan Jelaskan untuk Menulis Pertanyaan MySQL yang Lebih Baik

Lisa Kudrow
Lisa Kudrowasal
2025-02-28 08:32:10315semak imbas

pengoptimuman pertanyaan mysql dengan menjelaskan: menyelam dalam

Apabila anda melaksanakan pertanyaan MySQL, pengoptimuman pertanyaan membuat pelan pelaksanaan. Untuk memeriksa pelan ini, gunakan arahan EXPLAIN. EXPLAIN tidak ternilai untuk memahami dan mengoptimumkan pertanyaan yang perlahan, namun banyak pemaju yang kurang menggunakannya. Artikel ini meneroka output EXPLAIN dan aplikasinya dalam skema dan pengoptimuman pertanyaan.

Using EXPLAIN to Write Better MySQL Queries

Takeaways utama:

    Leverage
  • untuk menganalisis rancangan pelaksanaan pertanyaan, menentukan ketidakcekapan, dan meningkatkan prestasi. EXPLAIN
  • Decipher
  • lajur output (mis., EXPLAIN, type, possible_keys, key, rows) untuk memahami pemprosesan pertanyaan dan mengenal pasti kawasan untuk penambahbaikan. Extra
  • Menambah indeks secara strategik ke jadual berdasarkan lajur dalam
  • atau JOIN klausa untuk mengurangkan imbasan baris secara drastik, meningkatkan kelajuan dan meminimumkan masa beban. WHERE
  • menggunakan
  • dan EXPLAIN EXTENDED untuk pandangan terperinci ke dalam transformasi pertanyaan dan pelaksanaan, terutamanya untuk tugas pengoptimuman yang kompleks. SHOW WARNINGS
  • Secara kerap mengkaji dan mengoptimumkan pertanyaan SQL menggunakan
  • untuk mengekalkan prestasi pangkalan data yang optimum, terutamanya dalam aplikasi dinamik dengan data yang berkembang. EXPLAIN

pemahaman output EXPLAIN hanya awalan pertanyaan

anda dengan

. Mari kita menganalisis contoh asas: SELECT EXPLAIN

output sampel mungkin kelihatan seperti ini:
<code class="language-sql">EXPLAIN SELECT * FROM categoriesG;</code>

output yang seolah -olah ringkas ini kaya dengan maklumat. Lajur utama ialah:
<code>********************** 1. row **********************
           id: 1
  select_type: SIMPLE
        table: categories
         type: ALL
possible_keys: NULL
          key: NULL
      key_len: NULL
          ref: NULL
         rows: 4
        Extra: 
1 row in set (0.00 sec)</code>
  • id: Pengenalpastian berurutan untuk setiap SELECT dalam pertanyaan (relevan untuk subqueries bersarang).
  • select_type: Jenis SELECT pertanyaan (mudah, primer, diperolehi, subquery, dll.). SIMPLE menunjukkan pertanyaan langsung tanpa subqueries atau UNION s.
  • table: jadual yang dirujuk oleh baris.
  • type: Bagaimana MySQL menyertai jadual. Penting untuk mengenal pasti indeks atau kawasan yang hilang untuk penulisan semula pertanyaan. Nilai berkisar dari sangat cekap (system, const, eq_ref) kepada tidak cekap (ALL, menunjukkan imbasan jadual penuh).
  • possible_keys: Kekunci yang berpotensi boleh digunakan oleh MySQL. NULL tidak mencadangkan indeks yang relevan.
  • key: Indeks sebenar digunakan. Mungkin berbeza daripada possible_keys kerana pilihan pengoptimuman.
  • key_len: panjang indeks yang dipilih.
  • ref: lajur atau pemalar berbanding indeks dalam lajur key.
  • rows: bilangan baris yang diperiksa. Titik nilai tinggi kepada keperluan pengoptimuman yang berpotensi, terutamanya dengan JOIN s dan subqueries.
  • Extra: Maklumat tambahan (mis., "Menggunakan sementara," "Menggunakan Filesort"). Rujuk dokumentasi MySQL untuk tafsiran terperinci.

EXPLAIN EXTENDED memberikan butiran lanjut. Gunakan SHOW WARNINGS selepas itu untuk melihat transformasi pertanyaan yang dilakukan oleh pengoptimum:

<code class="language-sql">EXPLAIN SELECT * FROM categoriesG;</code>

prestasi penyelesaian masalah dengan EXPLAIN

mari kita menggambarkan mengoptimumkan pertanyaan yang kurang baik. Pertimbangkan pangkalan data e-dagang (skema tersedia di GitHub) yang kurang indeks. Pertanyaan yang kurang bertulis mungkin kelihatan seperti ini:

<code>********************** 1. row **********************
           id: 1
  select_type: SIMPLE
        table: categories
         type: ALL
possible_keys: NULL
          key: NULL
      key_len: NULL
          ref: NULL
         rows: 4
        Extra: 
1 row in set (0.00 sec)</code>

output EXPLAIN kemungkinan akan mendedahkan "semua" jenis gabungan, NULL untuk possible_keys dan key, dan nilai -nilai rows yang sangat tinggi, menunjukkan imbasan jadual penuh untuk setiap jadual. Ini sangat tidak cekap.

Menambah kunci dan indeks utama (mis., Pada lajur yang digunakan dalam klausa JOIN) secara dramatik meningkatkan prestasi. Mengulangi EXPLAIN selepas menambahkan indeks akan menunjukkan nilai rows yang lebih rendah dan jenis gabungan yang lebih cekap ("const," "eq_ref").

Contoh lain melibatkan dua meja, masing -masing bergabung dengan UNION: productlines

<code class="language-sql">EXPLAIN EXTENDED SELECT City.Name FROM City JOIN Country ON (City.CountryCode = Country.Code) WHERE City.CountryCode = 'IND' AND Country.Continent = 'Asia';
SHOW WARNINGS;</code>
tanpa indeks yang sesuai,

akan menunjukkan imbasan meja penuh. Menambah indeks dan menempatkan secara strategik EXPLAIN keadaan dalam subqueries WHERE boleh mengurangkan jumlah baris yang diimbas. UNION

Ringkasan

EXPLAIN adalah sekutu anda dalam pengoptimuman pertanyaan MySQL. Dengan menganalisis outputnya, anda boleh mengenal pasti dan menangani kesesakan prestasi, yang membawa kepada pertanyaan yang lebih cekap dan lebih cepat. Ingat bahawa hanya menambah indeks tidak selalu mencukupi; Struktur pertanyaan juga memainkan peranan penting. Penggunaan biasa EXPLAIN adalah kunci untuk mengekalkan kesihatan pangkalan data, terutamanya dalam aplikasi dinamik.

Atas ialah kandungan terperinci Menggunakan Jelaskan untuk Menulis Pertanyaan MySQL yang Lebih Baik. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
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