2017-01-13 155 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秒鐘才能完成。