今天在mongodb索引帮助文档里发现下边的描述:
集合order有以下索引:
{ qty: 1 }
{ status: 1, ord_date: -1 }
{ status: 1 }
{ ord_date: -1 }
查询语句:
db.orders.find( { qty: { $gt: 10 } } ).sort( { status: 1 } )
That is, MongoDB does not use the { qty: 1 } index for the query, and the separate { status: 1 } or the { status: 1, ord_date: -1 } index for the sort.
sort不能使用{ status: 1 } 或 { status: 1, ord_date: -1 } 我能理解,但是为什么find不能使用{ qty: 1 } 这个索引呢?
补充:是我理解错了,查询最后使用了{qty:1}这个索引
Pertama sekali, izinkan saya bertanya soalan, adakah anda telah mencuba indeks mana yang digunakan dalam pertanyaan ini?
Beritahu saya tentang perenggan itu dalam bahasa Inggeris sekali lagi saya rasa anda mungkin salah faham maksudnya. Ayat ini bermaksud: enjin pertanyaan tidak akan menggunakan
{qty:1}
untuk memenuhifind
daripada dan pada masa yang sama akan menggunakan{status: 1}
atau{status: 1, ord_date: -1}
untuk memenuhisort
. Biar saya nyatakan dengan lebih jelas: pertanyaan sama ada menggunakan{qty: 1}
untuk memenuhifind
(dan kemudian menggunakan pengisihan memori), atau menggunakan{status: 1}
atau{status: 1, ord_date: -1}
untuk memenuhi pengisihan (tetapi hanya boleh mencari keputusan yang ditetapkan melalui pengimbasan set ).Tiada indeks dalam indeks sedia ada anda yang boleh memenuhi kedua-dua pertanyaan dan pengisihan Indeks yang boleh mencapai tujuan ini ialah:
{status: 1, qty: 1}
. Tetapi masalahnya ialah ini tidak semestinya pilihan yang baik. Mungkin{qty: 1}
+pengisihan memori akan menjadi lebih cekap. Semuanya bergantung pada pengedaran data anda. Prinsip khusus sebenarnya sama dengan indeks dalam RDBMS, atau indeks menggunakan pokok B/B+ mempunyai kebaikan ini. Jika anda tidak dapat menerangkannya dengan jelas dalam beberapa perkataan, mari cari maklumat yang berkaitan.Cara mudahnya ialah membina semua indeks yang baru disebut, kemudian jalankan pertanyaan ini dan biarkan mereka mengoyakkannya sendiri Pada akhirnya, enjin pertanyaan akan memilih indeks terbaik untuk anda berdasarkan data sampel.
Jadi kembali kepada soalan asal, adakah anda telah mencuba indeks yang mana untuk dipilih? Kerana indeks mana yang menang akhirnya ditentukan berdasarkan pengedaran data anda, tiada jawapan yang pasti di sini. Saya sanggup bertaruh
{status: 1, qty: 1}
untuk menang.