[英]How speed up program? (Lot of slow mysql queries)
我的數據庫有30萬行,我需要按算法過濾一些行。
protected boolean validateMatch(DbMatch m) throws MatchException, NotSupportedSportException{
// expensive part
List<DbMatch> hh = sd.getMatches(DateService.beforeDay(m.getStart()), m.getHt(), m.getCountry(),m.getSportID());
List<DbMatch> ah = sd.getMatches(DateService.beforeDay(m.getStart()), m.getAt(), m.getCountry(),m.getSportID());
....
我的休眠dao函數用於從Mysql加載數據,它是初始化數組大小的2倍。
public List<DbMatch> getMatches(Date before,String team, String country,int sportID) throws NotSupportedSportException{
//Match_soccer where date between :start and :end
Criteria criteria = session.createCriteria(DbMatch.class);
criteria.add(Restrictions.le("start",before));
criteria.add(Restrictions.disjunction()
.add(Restrictions.eq("ht", team))
.add(Restrictions.eq("at", team)));
criteria.add(Restrictions.eq("country",country));
criteria.add(Restrictions.eq("sportID",sportID));
criteria.addOrder(Order.desc("start") );
return criteria.list();
}
示例我如何嘗試過濾數據
function List<DbMatch> filter(List<DbMatch> mSet){
List<DbMatch> filtred = new ArrayList<>();
for(DbMatch m:mSet){
if(validateMatch(DbMatch m))filtred.add(m);
}
}
(1)我嘗試了不同的標准設置,並使用秒表計算了功能時間。 我的結果是當我使用filter(matches)
匹配大小1000時,我的程序需要3分21 s 659 ms。
(2)我嘗試刪除criteria.addOrder(Order.desc("start"));
比在3分鍾12秒811毫秒后過濾的程序。
(3)但是如果我刪除criteria.addOrder(Order.desc("start"));
並添加criteria.setMaxResults(1);
結果是22 s 311毫秒。
使用最后一個配置,我可以按22,3 * 300 = 22300 s(〜6h)過濾所有300,000條記錄,但是如果使用第一個功能,我應該等待(〜60 h)。
如果我要使用沒有順序和限制的條件,則必須確保我的表按數據庫上的日期排序,因為獲取最后一個匹配很重要。
所有數據都存儲在matches
表中。
表索引:
表,非唯一,鍵名,Seq_in_index,Column_name,排序規則,基數,子部分,壓縮,空,Index_type,注釋,Index_comment
匹配項,0,PRIMARY,1,中,A,220712 、、、、、 BTREE,
比賽,0,UK_kcenwf4m58fssuccpknl1v25v,1,beid,A,220712,,,,是,BTREE,,
更新
添加后ALTER TABLE matches ADD INDEX (sportID, country);
現在編程時間減少到15秒,可進行1000場比賽。 但是,如果我不使用order by並添加限制,則只需要等待4秒鍾即可獲得1000個數學運算。
如何應對這種情況以提高程序執行速度?
您的首要任務是弄清楚每個組件處理請求所花的時間。
找出由ORM生成的SQL查詢,並在MySQL工作台中手動運行該查詢,並查看所需的時間(未緩存)。 您也可以要求它解釋索引的用法。
如果足夠快,那么花費更長的時間就是您的Java代碼,並且您需要優化算法。 您可以使用JConsole進一步深入研究。
如果您確定哪個組件花費的時間更長,可以在此處發表分析,我們會相應地提出建議。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.