Saya tahu kepentingan indeks dan cara pesanan sertai mengubah prestasi. Saya telah membaca banyak perkara yang berkaitan dengan indeks berbilang lajur tetapi tidak menemui jawapan kepada soalan saya.
Saya ingin tahu sama ada susunan yang dinyatakan penting jika saya melakukan indeks berbilang lajur. Sangkaan saya tidak, dan enjin akan menganggap mereka sebagai satu kumpulan di mana pesanan itu tidak penting. Tetapi saya mahu mengesahkannya.
Sebagai contoh, dari laman web mysql (http://dev.mysql.com/doc/refman/5.0/en/multiple-column-indexes.html)
CREATE TABLE test ( id INT NOT NULL, last_name CHAR(30) NOT NULL, first_name CHAR(30) NOT NULL, PRIMARY KEY (id), INDEX name (last_name,first_name) );
Dalam apa jua keadaan, adakah perkara berikut lebih baik atau setara, dan adakah ia memberi manfaat?
CREATE TABLE test ( id INT NOT NULL, last_name CHAR(30) NOT NULL, first_name CHAR(30) NOT NULL, PRIMARY KEY (id), INDEX name (first_name,last_name) );
Khususnya:
INDEX name (last_name,first_name)
Perbandingan
INDEX name (first_name,last_name)
Dua indeks adalah berbeza. Ini benar dalam MySQL dan pangkalan data lain. MySQL menerangkan perbezaan dalam dokumentasi .
Pertimbangkan dua indeks:
Kedua-duanya hendaklah memohon sama rata kepada:
idx_lf adalah optimum untuk:
idx_fl akan paling sesuai untuk situasi berikut:
Untuk banyak kes seperti ini, boleh menggunakan dua indeks, tetapi satu daripadanya adalah optimum. Sebagai contoh, pertimbangkan untuk menggunakan pertanyaan idx_lf:
MySQL boleh menggunakan idx_lf untuk membaca keseluruhan jadual dan kemudian menapis selepas
order by
. Saya tidak fikir ini adalah pilihan pengoptimuman dalam amalan (untuk MySQL), tetapi ia mungkin berlaku dalam pangkalan data lain.Apabila membincangkan indeks berbilang lajur, saya menggunakan analogi buku telefon. Buku telefon pada asasnya ialah indeks dengan nama akhir dahulu dan kemudian nama pertama. Jadi susunan isihan ditentukan oleh "lajur" mana yang didahulukan. Carian dibahagikan kepada kategori berikut:
Jika anda mencari orang yang mempunyai nama keluarga Smith, anda boleh mencari mereka dengan mudah kerana buku itu diisih mengikut nama keluarga.
Jika anda mencari seseorang bernama John, buku telefon tidak berguna kerana John tersebar di seluruh buku. Anda perlu mengimbas keseluruhan buku telefon untuk mencarinya.
Jika anda mencari orang yang mempunyai nama keluarga tertentu Smith dan nama pertama John, buku ini akan membantu kerana anda akan mendapati Smith disusun bersama-sama dan dalam Smiths, John juga ditemui dalam susunan yang disusun.
Jika anda mempunyai buku telefon yang diisih mengikut nama pertama dan kemudian mengikut nama keluarga, pengisihan buku telefon akan membantu anda dalam kes #2 dan #3 di atas, tetapi tidak dalam kes #1 .
Ini menerangkan kes mencari nilai yang tepat, tetapi bagaimana jika anda mencari mengikut julat nilai? Katakan anda ingin mencari semua orang yang nama pertamanya ialah John dan nama keluarga mereka bermula dengan "S" (Smith, Saunders, Staunton, Sherman, dll.). Johns diisih mengikut "J" dalam setiap nama akhir, tetapi jika anda mahu semua Johns dengan semua nama akhir bermula dengan "S", Johns tidak dikumpulkan bersama. Mereka tersebar semula, jadi anda akhirnya perlu mengimbas semua nama yang nama keluarganya bermula dengan "S." Walau bagaimanapun, jika buku telefon itu disusun mengikut nama pertama dan kemudian dengan nama keluarga, anda akan mendapati bahawa semua John akan dikumpulkan bersama, dan kemudian dalam John, semua nama keluarga "S" akan dikumpulkan bersama.
Jadi susunan lajur dalam indeks berbilang lajur pastinya penting. Sejenis pertanyaan mungkin memerlukan susunan lajur tertentu bagi indeks. Jika anda mempunyai berbilang jenis pertanyaan, anda mungkin memerlukan berbilang indeks untuk membantunya, dengan lajur dalam susunan yang berbeza.
Anda boleh membaca pembentangan saya Really How to Design an Index untuk mengetahui lebih lanjut, atau menonton video.