2017-01-13 18 views
0

私はImageテーブルに10,000近くのレコードがあり、クエリでそれらを取得したいと考えています。単純なクエリでのパフォーマンスの問題

イメージモデルの定義:私が作るでしょう

{ 
    "name": "Image", 
    "plural": "Images", 
    "base": "PersistedModel", 
    "idInjection": true, 
    "options": { 
    "validateUpsert": true 
    }, 
    "properties": { 
    "name": { 
     "type": "string", 
     "required": false 
    }, 
    "uploaddate": { 
     "type": "date", 
     "required": true 
    }, 
    "location": { 
     "type": "string" 
    }, 
    "description": { 
     "type": "string" 
    }, 
    "shootingdate": { 
     "type": "date" 
    }, 
    "imageStatusTitle": { 
     "type": "string" 
    }, 
    "category": { 
     "type": "string" 
    }, 
    "canton": { 
     "type": "string" 
    }, 
    "rights": { 
     "type": "boolean" 
    }, 
    "earmarked": { 
     "type": "boolean" 
    } 
    }, 
    "validations": [], 
    "relations": { 
    "imageStatus": { 
     "type": "embedsOne", 
     "model": "ImageStatus", 
     "foreignKey": "", 
     "options": { 
     "persistent": false 
     } 
    }, 
    "categories": { 
     "type": "hasMany", 
     "model": "ImageCategory", 
     "foreignKey": "" 
    }, 
    "votes": { 
     "type": "hasMany", 
     "model": "WebsiteUser", 
     "foreignKey": "imageId", 
     "through": "ImageVote" 
    }, 
    "original": { 
     "type": "embedsOne", 
     "model": "File", 
     "property": "original", 
     "options": { 
     "persistent": false 
     } 
    }, 
    "small": { 
     "type": "embedsOne", 
     "model": "File", 
     "property": "small", 
     "options": { 
     "persistent": true 
     } 
    }, 
    "medium": { 
     "type": "embedsOne", 
     "model": "File", 
     "property": "medium", 
     "options": { 
     "persistent": true 
     } 
    }, 
    "large": { 
     "type": "embedsOne", 
     "model": "File", 
     "property": "large", 
     "options": { 
     "persistent": true 
     } 
    }, 
    "xlarge": { 
     "type": "embedsOne", 
     "model": "File", 
     "property": "xlarge", 
     "options": { 
     "persistent": true 
     } 
    }, 
    "owner": { 
     "type": "belongsTo", 
     "model": "WebsiteUser", 
     "foreignKey": "fotographerId" 
    }, 
    "widgets": { 
     "type": "hasMany", 
     "model": "Widget", 
     "through": "WidgetImage" 
    } 
    } 
    ... 

クエリは次のようになります。

const query = { 
     fields: ['id', 'name', 'fotographerId'], 
     include: { 
      relation: 'owner', 
      fields: ['id', 'firstname', 'lastname', 'street', 'zip', 'city', 'email', 'phone', 'mobile', 'locale'] 
     } 
    }; 

    if (0 < whereFilter.length) { 
     query.where = { 
      and: whereFilter 
     }; 
    } 

    app.models.Image.find(query, function(err, records) { 
     ... 
    } 

問題は、このクエリを実行するために5分かかるということです。 それから、デフォルトの注文explained in this issueを削除して4分改善します。

しかし、10'000文書のこのようなクエリでは、とにかく4分ほど遅いです。何が問題になるのか見ていますか?または、このクエリをスピードアップする方法を知っていますか?

+0

インデックスとして検索すると、検索が向上します –

+0

where句はここでは空ですので、実際にはフィルタはありません。あるいは、私が選択しているフィールドのインデックスを作成することを意味しますか? – Simoyw

+0

フィールドにインデックスを作成することをお勧めします。 私には別の問題があります。改善する必要があります。サブ文書がたくさんあります。必要なフィールドを再訪するか参照することができます。 私たちが作るサブドキュメントはコレクションになり、各ドキュメントは関連するサブドキュメントを検索する必要があります。 単純な提案は、非常に多くのサブ文書を使用しないでください。 –

答えて

0

誰かが同じ問題を抱えている場合に備えてください。パフォーマンスの問題の原因は、モデルがフェッチ/ロードされるたびにいくつかのコードを実行するフックにありました。これで2秒かかります。