簡體   English   中英

程序如何加速? (很多緩慢的mysql查詢)

[英]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.

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