Rumah > pangkalan data > tutorial mysql > Indeks MySQL manakah yang Lebih Cekap untuk Pertanyaan Julat: Mendahului dengan Lajur Cardinaliti Tinggi atau Rendah?

Indeks MySQL manakah yang Lebih Cekap untuk Pertanyaan Julat: Mendahului dengan Lajur Cardinaliti Tinggi atau Rendah?

Barbara Streisand
Lepaskan: 2024-11-29 02:55:14
asal
596 orang telah melayarinya

Which MySQL Index Is More Efficient for Range Queries: Leading with High or Low Cardinality Column?

Pengoptimuman Indeks untuk Pertanyaan Julat

Lajur dengan kardinaliti yang lebih tinggi menyumbang kepada indeks yang lebih cekap dalam MySQL. Walau bagaimanapun, dalam kes pertanyaan julat, pengecualian dikenakan.

Pernyataan Masalah

Pertimbangkan jadual dengan struktur berikut:

CREATE TABLE `files` (
  `did` int(10) UNSIGNED NOT NULL DEFAULT '0',
  `filename` VARBINARY(200) NOT NULL,
  `ext` VARBINARY(5) DEFAULT NULL,
  `fsize` DOUBLE DEFAULT NULL,
  `filetime` DATETIME DEFAULT NULL,
  PRIMARY KEY (`did`,`filename`),
  KEY `fe` (`filetime`,`ext`),          -- Option 1
  KEY `ef` (`ext`,`filetime`)           -- Option 2
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
Salin selepas log masuk

Masa fail adalah berbeza, manakala terdapat bilangan nilai ext yang terhad (iaitu, kardinaliti yang lebih tinggi untuk masa fail, kardinaliti yang lebih rendah untuk samb). Pertanyaan melibatkan kedua-dua lajur dengan syarat berikut:

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

Indeks yang manakah, fe atau ef, yang lebih optimum?

Jawapan

Mengejutkan , indeks dengan ext sebagai lajur pertama, walaupun kardinalitinya lebih rendah, adalah lebih cekap untuk ini pertanyaan.

Penjelasan

Pengoptimum MySQL menganalisis alternatif indeks dan memilih yang mempunyai kos terendah. Menggunakan jejak pengoptimum, kita boleh melihat alasan di sebalik pilihan ini.

Untuk fe (masa fail dahulu), MySQL menganggarkan bahawa ia perlu mengimbas 16684 baris untuk mencari fail 'gif', walaupun dengan keadaan julat dihidupkan masa fail.

Untuk ef (ext first), walau bagaimanapun, ia menganggarkan bahawa ia boleh menggunakan kedua-dua lajur indeks dan dengan cepat menelusuri ke baris yang sesuai, menyebabkan kos hanya 646.61. MySQL memilih indeks ini kerana ia boleh menggunakan lebih banyak bahagian penting, menjadikan carian lebih cekap.

Kesimpulan

  • Utamakan lajur yang terlibat dalam ujian kesamaan dalam indeks, tanpa mengira kardinaliti.
  • Pelan pertanyaan tidak akan melangkaui 'julat' pertama lajur.
  • Dalam konteks ini, kardinaliti tidak relevan untuk indeks komposit dan pertanyaan julat.
  • InnoDB boleh menggunakan lajur indeks melebihi lajur yang digunakan untuk penapisan ("Menggunakan keadaan indeks").

Atas ialah kandungan terperinci Indeks MySQL manakah yang Lebih Cekap untuk Pertanyaan Julat: Mendahului dengan Lajur Cardinaliti Tinggi atau 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