1、文档结构示例
{
_id: xxxx,
user: 'xiaoming',
level: 5,
from: 'iPhone',
info: 'something wrong'
}
2、场景:user为'xiaoming'的文档有六七百万条
3、问题:怎么提升aggregate+group+sum速度
aggregate([
{$match:{user: 'xiaoming', info:{$regex:'wrong'}}},
{$group:{_id:null, count:{$sum:1}}}
])
用上面这个来统计xiaoming带有wrong的文档数量,结果
{"_id": null, "count": 2299999 }
耗时30s-40s。user、info、user+info三种索引都尝试过,速度都没有提升
baidu、google查到‘带条件计数慢无解’
怎么提升效率,10s以内能实现吗
Perkara pertama yang perlu diperhatikan ialah untuk operasi jenis OLAP, jangkaan tidak boleh terlalu tinggi. Lagipun, ia adalah operasi jumlah data yang besar sahaja jauh melebihi operasi OLTP biasa, jadi adalah tidak realistik dan tidak bermakna untuk memerlukan kelajuan dan keselarasan operasi OLTP. Tetapi itu tidak bermakna tiada ruang untuk pengoptimuman.
Pertanyaan yang sepadan hendaklah ditukar kepada:Mari mulakan dengan indeks. Berapa lamakah masa yang diambil untuk mencari 6 juta
{user: "xiaoming"}
item tanpa indeks? Imbasan jadual penuhCOLLSCAN
Mencari 6 juta keping data daripada 7 juta keping data dan mencari 6 juta keping data daripada 100 juta keping data jelas merupakan dua konsep yang berbeza. Tekan indeksIXSCAN
, perbezaan ini akan menjadi jauh lebih kecil dan hampir boleh diabaikan. Jadi anda salah untuk mengatakan{user: 1}
bahawa indeks ini tidak mempunyai kesan. Ini mungkin hanya kerana jumlah data dalam koleksi terlalu kecil untuk melihat perbezaannya. Dengan cara ini, perlu disebutkan bahawa untuk melihat sama ada terdapat perbezaan dalam kecekapan, anda harus melihat rancangan pelaksanaan, bukan masa pelaksanaan, kerana masanya tidak tepat.Dengan indeks
user
, masih terdapat 6 juta hasil, dan bahagian yang tinggal adalahregex
tidak boleh mencapai indeks, jadi tidak bermakna sama ada terdapat indeks untukregex
atau tidak. Selepas menemui 6 juta keping data, terdapat satu lagi operasiinfo
pada 6 juta keping data. Satu-satunya perkara yang boleh membantu untuk operasi ini ialahfilter
, tetapi pengindeksan teks penuh tidak boleh menggantikan sepenuhnya ungkapan biasa Anda perlu membaca dokumentasi untuk isu tertentu. Jika pengindeksan teks penuh boleh dilaksanakan, indeks komposit boleh diwujudkan:全文索引
dikemas kini atau disisipkan
info
atauSaya tidak tahu, tetapi adakah lebih baik jika ia boleh dibahagikan kepada dua perlawanan? .
Serupa dengan
Perkara utama yang saya fikir adalah mengambil masa.
Jika ada indeks, indeks pengguna.
Keperluan masa nyata tidak tinggi dan boleh dikira dengan kerap dan dicache