Rumah >pangkalan data >tutorial mysql >Bagaimanakah Saya Boleh Mengoptimumkan Pertanyaan SQL untuk Mendapatkan Item Terbaru dengan Cekap daripada Setiap Kategori dalam Pangkalan Data Besar?

Bagaimanakah Saya Boleh Mengoptimumkan Pertanyaan SQL untuk Mendapatkan Item Terbaru dengan Cekap daripada Setiap Kategori dalam Pangkalan Data Besar?

Barbara Streisand
Barbara Streisandasal
2025-01-22 01:51:09359semak imbas

How Can I Optimize SQL Queries to Efficiently Retrieve the Newest Items from Each Category in a Large Database?

Meningkatkan Prestasi Pertanyaan SQL untuk Set Data Besar

Pertanyaan SQL yang cekap adalah penting untuk mengekalkan prestasi pangkalan data, terutamanya apabila berurusan dengan pangkalan data yang besar dan pengambilan data yang kompleks. Ini amat kritikal apabila bekerja dengan berbilang jadual yang saling berkaitan.

Cabaran: Mendapatkan semula Item Terkini bagi setiap Kategori

Bayangkan pangkalan data menyimpan item yang dikategorikan mengikut ID. Matlamatnya adalah untuk memaparkan setiap kategori dengan empat item yang paling baru ditambah. Kaedah tradisional menggunakan berbilang pertanyaan bagi setiap kategori membawa kepada beban pangkalan data yang berlebihan, terutamanya dengan sejumlah besar kategori.

Pertanyaan Dioptimumkan: Memanfaatkan Pengumpulan dan Menyertai

Pertanyaan dioptimumkan berikut menggunakan gabungan luar dan pengumpulan untuk mendapatkan semula data yang dikehendaki dalam satu pas pangkalan data:

<code class="language-sql">SELECT i1.*
FROM item i1
LEFT OUTER JOIN item i2
  ON (i1.category_id = i2.category_id AND i1.item_id < i2.item_id)
GROUP BY i1.item_id
HAVING COUNT(*) < 4;</code>

Pertanyaan ini membandingkan setiap item (i1) dengan item yang lebih baharu (i2) dalam kategori yang sama. Jika kurang daripada empat item baharu wujud, i1 disertakan dalam keputusan.

Pendekatan Alternatif

Kaedah lain, seperti pembolehubah pengguna MySQL untuk penomboran baris dalam setiap kategori, menawarkan penyelesaian alternatif:

<code class="language-sql">SELECT *
FROM (
    SELECT i.*, @r := IF(@g = category_id, @r+1, 1) AS rownum, @g := category_id
    FROM (SELECT @g:=null, @r:=0) AS _init
    CROSS JOIN item i
    ORDER BY i.category_id, i.date_listed
) AS t
WHERE t.rownum <= 4;</code>

Untuk MySQL 8.0.3 dan yang lebih baru, fungsi tetingkap SQL menyediakan pendekatan piawai:

<code class="language-sql">WITH numbered_item AS (
  SELECT *, ROW_NUMBER() OVER (PARTITION BY category_id ORDER BY item_id DESC) AS rownum
  FROM item
)
SELECT * FROM numbered_item WHERE rownum <= 4;</code>

Faedah Prestasi

Pertanyaan yang dioptimumkan ini meningkatkan prestasi dengan ketara apabila bilangan kategori bertambah. Dengan meminimumkan beban pangkalan data dan mengoptimumkan penggunaan sumber, aplikasi memastikan pengambilan data yang cekap walaupun dengan set data yang luas.

Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Mengoptimumkan Pertanyaan SQL untuk Mendapatkan Item Terbaru dengan Cekap daripada Setiap Kategori dalam Pangkalan Data Besar?. 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