Indeks Komposit manakah yang Optimum untuk Pertanyaan Julat: Lajur Kardinaliti Tinggi lwn. Rendah?

Mary-Kate Olsen
Lepaskan: 2024-11-24 14:10:47
asal
183 orang telah melayarinya

Which Composite Index is Optimal for Range Queries: High vs. Low Cardinality Columns?

Penempatan Lajur Kardinaliti Tinggi dalam Indeks Komposit dengan Pertanyaan Julat

Apabila menanyakan jadual dengan indeks komposit yang melibatkan keadaan julat, peletakan lajur dalam indeks boleh memberi kesan ketara kepada prestasi.

Pertimbangkan fail jadual dengan kunci utama (did, nama fail) dan dua indeks komposit: INDEX(masa fail, ext) dan INDEX(ext, masa fail). Kedua-dua indeks mengandungi lajur masa fail, yang mempunyai kardinaliti lebih tinggi daripada ext.

Pertanyaan:

WHERE ext = '...'
  AND filetime BETWEEN ... AND ...
Salin selepas log masuk

memerlukan mengakses data berdasarkan kedua-dua ext dan masa fail. Timbul persoalan: indeks manakah yang optimum untuk pertanyaan sedemikian?

Analisis

Untuk menentukan indeks optimum, kita boleh menggunakan FORCE INDEX dan memeriksa rancangan pelaksanaan:

-- Force range on filetime first
FORCE INDEX(fe) SELECT COUNT(*), AVG(fsize)
FROM files
WHERE ext = 'gif'
  AND filetime >= '2015-01-01'
  AND filetime < '2015-01-01' + INTERVAL 1 MONTH;

-- Force low-cardinality ext first
FORCE INDEX(ef) SELECT COUNT(*), AVG(fsize)
FROM files
WHERE ext = 'gif'
  AND filetime >= '2015-01-01'
  AND filetime < '2015-01-01' + INTERVAL 1 MONTH;
Salin selepas log masuk

Output menunjukkan bahawa INDEX(ext, filetime) (ef) mempunyai baris yang jauh lebih rendah kiraan, menunjukkan imbasan yang lebih cekap.

Jejak Pengoptimum

Untuk menganalisis lebih lanjut tingkah laku pengoptimum, kita boleh menggunakan jejak pengoptimum:

SELECT explain_format = 'JSON';

SELECT COUNT(*), AVG(fsize)
FROM files
WHERE ext = 'gif'
  AND filetime >= '2015-01-01'
  AND filetime < '2015-01-01' + INTERVAL 1 MONTH;
Salin selepas log masuk

Jejak mendedahkan bahawa pengoptimum memilih INDEX(ext, filetime) kerana ia boleh menggunakan kedua-dua lajur indeks untuk menapis dan mengambil data. Sebaliknya, INDEX(masa fail, ext) hanya boleh menggunakan lajur pertama (masa fail) untuk penapisan.

Kesimpulan

Berdasarkan analisis, kesimpulan berikut boleh dibuat dilukis:

  • Untuk indeks komposit yang digunakan dalam pertanyaan julat, lajur yang terlibat dalam predikat kesamaan (sambungan dalam kes ini) hendaklah diletakkan dahulu dalam definisi indeks.
  • Prestasi pertanyaan dipertingkatkan apabila lajur dalam indeks disusun mengikut susunan ia digunakan dalam klausa WHERE.
  • Kardinaliti sahaja bukanlah faktor penentu dalam menentukan indeks optimum. Dalam senario di mana lajur julat mempunyai kardinaliti yang lebih tinggi tetapi lajur kesamaan terlibat dalam predikat kesamaan, meletakkan lajur kesamaan terlebih dahulu menghasilkan prestasi yang lebih baik.

Atas ialah kandungan terperinci Indeks Komposit manakah yang Optimum untuk Pertanyaan Julat: Lajur Kardinaliti Tinggi lwn. Rendah?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan