簡體   English   中英

MongoDB上的復合索引

[英]Compound Indexes on MongoDB

對不起,我的英語,我需要有關mongodb索引的幫助。 我有一個封頂的集合(大小:10GB),其中包含一些用於應用程序日志的字段。 示例結構:日志[_id,userId,總數,類型,時間,響應,請求]。 我創建了復合索引:[userId,time,type]。 今天我得到兩個數組,分別是按userId分組的記錄,其中“類型”為“空”和“ 1”。 還有我的兩個查詢示例:

 $group = array(
        array(
            '$match' => array(
                'userId' => $userId,
                'time' => array(
                        '$gt' => date("Y-m-d")
                    ),
                'type' => array('$ne' => null)
                )
            ),
        array(
            '$group' => array(
                "_id" => '$userId',
                "total" => array('$sum' => '$sum'),
                "count" => array('$sum' => 1)
            ),
        )
    );
    $results = $collections->aggregate($group);

    $group = array(
        array(
            '$match' => array(
                'userId' => $userId,
                'time' => array(
                    '$gt' => date("Y-m-d")
                    ),
                'type' => 1
                )
            ),
        array(
            '$group' => array(
                "_id" => '$userId',
                "count" => array('$sum' => 1)
            ),
        )
    );

    $results2 = $collections->aggregate($group);

如果當前用戶今天有100000個文檔在收集中-我的查詢速度非常慢(超過10秒)。 給我一些有關創建正確索引的建議,請:)謝謝。

根據您發布的解釋,正在使用正確的索引( BtreeCursor ),它僅使用索引(即,它是一個覆蓋的索引查詢indexOnly為true),在這種情況下,沒有任何內容被匹配( n = 0 ) 。 因此,盡管第一個示例中的$ne作為子句並不是很有效,但是所有檢查通常都會進行。

但是,基於解釋的主要問題可能是索引似乎沒有完全存儲在內存中。 列出了13個yields,而這樣的查詢產生yield的最常見原因是它必須對磁盤進行故障轉移以分頁。由於如前所述,由於僅使用索引,因此這些yield意味着磁盤故障索引,因此表明整個索引不在內存中。

如果您在此之后立即重新運行查詢,它應該會更快(假設索引實際上可以容納到可用內存中),因為索引將在第一次運行時被分頁。 如果第二輪運行仍然很慢並且顯示出收益,則說明您要么沒有足夠的內存來將索引保存在內存中,要么其他原因正在將其從內存中逐出,並且您實質上存在內存爭用導致性能問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM