欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

mysql數(shù)據(jù)庫查詢優(yōu)化 mysql效率第2/3頁

 更新時間:2008年01月02日 18:55:37   作者:  
MySQL由于它本身的小巧和操作的高效, 在數(shù)據(jù)庫應(yīng)用中越來越多的被采用.我在開發(fā)一個P2P應(yīng)用的時候曾經(jīng)使用MySQL來保存P2P節(jié)點,由于P2P的應(yīng)用中,結(jié)點數(shù)動輒上萬個,而且節(jié)點變化頻繁,因此一定要保持查詢和插入的高效.以下是我在使用過程中做的提高效率的三個有效的嘗試. 1. 使用statement進行綁定查詢 2. 隨機的獲取記錄 3. 使用連接池管理連接.

   隨機的獲取記錄
在某些數(shù)據(jù)庫的應(yīng)用中, 我們并不是要獲取所有的滿足條件的記錄,而只是要隨機挑選出滿足條件的記錄. 這種情況常見于數(shù)據(jù)業(yè)務(wù)的統(tǒng)計分析,從大容量數(shù)據(jù)庫中獲取小量的數(shù)據(jù)的場合.
      有兩種方法可以做到
1.       常規(guī)方法,首先查詢出所有滿足條件的記錄,然后隨機的挑選出部分記錄.這種方法在滿足條件的記錄數(shù)很多時效果不理想.
2.       使用limit語法,先獲取滿足條件的記錄條數(shù), 然后在sql查詢語句中加入limit來限制只查詢滿足要求的一段記錄. 這種方法雖然要查詢兩次,但是在數(shù)據(jù)量大時反而比較高效.
示例代碼如下: 

復(fù)制代碼 代碼如下:

//1.常規(guī)的方法 
//性能瓶頸,10萬條記錄時,執(zhí)行查詢140ms, 獲取結(jié)果集500ms,其余可忽略 
int CDBManager::QueryHostCache(MYSQL* connecthandle, char * channelid, int ISPtype, CDBManager::CHostCacheTable * &hostcache) 
{      
       char selectSQL[SQL_LENGTH]; 
       memset(selectSQL, 0, sizeof(selectSQL)); 
       sprintf(selectSQL,"select * from HostCache where ChannelID = '%s' and ISPtype = %d", channelid, ISPtype); 
       if(mysql_real_query(connecthandle, selectSQL, strlen(selectSQL)) != 0)   //檢索 
              return 0; 
       //獲取結(jié)果集 
       m_pResultSet = mysql_store_result(connecthandle); 
       if(!m_pResultSet)   //獲取結(jié)果集出錯 
              return 0; 
       int iAllNumRows = (int)(mysql_num_rows(m_pResultSet));      ///<所有的搜索結(jié)果數(shù) 
       //計算待返回的結(jié)果數(shù) 
       int iReturnNumRows = (iAllNumRows <= RETURN_QUERY_HOST_NUM)? iAllNumRows:RETURN_QUERY_HOST_NUM; 
       if(iReturnNumRows <= RETURN_QUERY_HOST_NUM) 
       { 
              //獲取逐條記錄 
              for(int i = 0; i<iReturnNumRows; i++) 
              { 
                     //獲取逐個字段 
                     m_Row = mysql_fetch_row(m_pResultSet); 
                     if(m_Row[0] != NULL) 
                            strcpy(hostcache[i].sessionid, m_Row[0]); 
                     if(m_Row[1] != NULL) 
                            strcpy(hostcache[i].channelid, m_Row[1]); 
                     if(m_Row[2] != NULL) 
                            hostcache[i].ISPtype      = atoi(m_Row[2]); 
                     if(m_Row[3] != NULL) 
                            hostcache[i].externalIP   = atoi(m_Row[3]); 
                     if(m_Row[4] != NULL) 
                            hostcache[i].externalPort = atoi(m_Row[4]); 
                     if(m_Row[5] != NULL) 
                            hostcache[i].internalIP   = atoi(m_Row[5]); 
                     if(m_Row[6] != NULL) 
                            hostcache[i].internalPort = atoi(m_Row[6]);               
              } 
       } 
       else 
       { 
              //隨機的挑選指定條記錄返回 
              int iRemainder = iAllNumRows%iReturnNumRows;    ///<余數(shù) 
              int iQuotient = iAllNumRows/iReturnNumRows;      ///<商 
              int iStartIndex = rand()%(iRemainder + 1);         ///<開始下標   
              //獲取逐條記錄 
        for(int iSelectedIndex = 0; iSelectedIndex < iReturnNumRows; iSelectedIndex++) 
        { 
                            mysql_data_seek(m_pResultSet, iStartIndex + iQuotient * iSelectedIndex); 
                            m_Row = mysql_fetch_row(m_pResultSet); 
                  if(m_Row[0] != NULL) 
                       strcpy(hostcache[iSelectedIndex].sessionid, m_Row[0]); 
                   if(m_Row[1] != NULL) 
                                   strcpy(hostcache[iSelectedIndex].channelid, m_Row[1]); 
                   if(m_Row[2] != NULL) 
                       hostcache[iSelectedIndex].ISPtype      = atoi(m_Row[2]); 
                   if(m_Row[3] != NULL) 
                       hostcache[iSelectedIndex].externalIP   = atoi(m_Row[3]); 
                    if(m_Row[4] != NULL) 
                       hostcache[iSelectedIndex].externalPort = atoi(m_Row[4]); 
                   if(m_Row[5] != NULL) 
                       hostcache[iSelectedIndex].internalIP   = atoi(m_Row[5]); 
                   if(m_Row[6] != NULL) 
                       hostcache[iSelectedIndex].internalPort = atoi(m_Row[6]); 
        } 
      } 
       //釋放結(jié)果集內(nèi)容 
       mysql_free_result(m_pResultSet); 
       return iReturnNumRows; 


//2.使用limit版 
int CDBManager::QueryHostCache(MYSQL * connecthandle, char * channelid, unsigned int myexternalip, int ISPtype, CHostCacheTable * hostcache) 

       //首先獲取滿足結(jié)果的記錄條數(shù),再使用limit隨機選擇指定條記錄返回 
       MYSQL_ROW row; 
       MYSQL_RES * pResultSet; 
       char selectSQL[SQL_LENGTH]; 
       memset(selectSQL, 0, sizeof(selectSQL)); 

       sprintf(selectSQL,"select count(*) from HostCache where ChannelID = '%s' and ISPtype = %d", channelid, ISPtype); 
       if(mysql_real_query(connecthandle, selectSQL, strlen(selectSQL)) != 0)   //檢索 
              return 0; 
       pResultSet = mysql_store_result(connecthandle); 
       if(!pResultSet)        
              return 0; 
       row = mysql_fetch_row(pResultSet); 
       int iAllNumRows = atoi(row[0]); 
       mysql_free_result(pResultSet); 
       //計算待取記錄的上下范圍 
       int iLimitLower = (iAllNumRows <= RETURN_QUERY_HOST_NUM)? 
              0:(rand()%(iAllNumRows - RETURN_QUERY_HOST_NUM)); 
       int iLimitUpper = (iAllNumRows <= RETURN_QUERY_HOST_NUM)? 
              iAllNumRows:(iLimitLower + RETURN_QUERY_HOST_NUM); 
       //計算待返回的結(jié)果數(shù) 
       int iReturnNumRows = (iAllNumRows <= RETURN_QUERY_HOST_NUM)? 
               iAllNumRows:RETURN_QUERY_HOST_NUM; 

       //使用limit作查詢 
       sprintf(selectSQL,"select SessionID, ExternalIP, ExternalPort, InternalIP, InternalPort " 
              "from HostCache where ChannelID = '%s' and ISPtype = %d limit %d, %d" 
              , channelid, ISPtype, iLimitLower, iLimitUpper); 
       if(mysql_real_query(connecthandle, selectSQL, strlen(selectSQL)) != 0)   //檢索 
              return 0; 
       pResultSet = mysql_store_result(connecthandle); 
       if(!pResultSet) 
              return 0; 
       //獲取逐條記錄 
       for(int i = 0; i<iReturnNumRows; i++) 
       { 
              //獲取逐個字段 
              row = mysql_fetch_row(pResultSet); 
              if(row[0] != NULL) 
                     strcpy(hostcache[i].sessionid, row[0]); 
              if(row[1] != NULL) 
                     hostcache[i].externalIP   = atoi(row[1]); 
              if(row[2] != NULL) 
                     hostcache[i].externalPort = atoi(row[2]); 
              if(row[3] != NULL) 
                     hostcache[i].internalIP   = atoi(row[3]); 
              if(row[4] != NULL) 
                     hostcache[i].internalPort = atoi(row[4]);              
       } 
       //釋放結(jié)果集內(nèi)容 
       mysql_free_result(pResultSet); 
       return iReturnNumRows; 



相關(guān)文章

  • Mysql5 字符集編碼問題解決

    Mysql5 字符集編碼問題解決

    mysql 創(chuàng)建 數(shù)據(jù)庫時指定編碼很重要,很多開發(fā)者都使用了默認編碼,但是我使用的經(jīng)驗來看,制定數(shù)據(jù)庫的編碼可以很大程度上避免倒入導出帶來的亂碼問題。
    2009-10-10
  • mysql5.7.17壓縮包安裝配置方法圖文教程

    mysql5.7.17壓縮包安裝配置方法圖文教程

    這篇文章主要為大家詳細介紹了mysql 5.7.17壓縮包安裝配置方法圖文教程,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-11-11
  • MySQL開啟慢查詢方法及實例

    MySQL開啟慢查詢方法及實例

    這篇文章主要介紹了MySQL開啟慢查詢方法及實例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-04-04
  • 史上最簡單的MySQL數(shù)據(jù)備份與還原教程(上)(三十五)

    史上最簡單的MySQL數(shù)據(jù)備份與還原教程(上)(三十五)

    這篇文章主要為大家詳細介紹了史上最簡單的MySQL數(shù)據(jù)備份與還原教程第一篇,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-10-10
  • Mysql中where與on的區(qū)別及何時使用詳析

    Mysql中where與on的區(qū)別及何時使用詳析

    MySQL當中的限制條件可以使用on或者where,兩者在不同的情況下具有不同而意義,這篇文章主要給大家介紹了關(guān)于Mysql中where與on的區(qū)別及何時使用的相關(guān)資料,需要的朋友可以參考下
    2021-08-08
  • InnoDB存儲引擎中的表空間詳解

    InnoDB存儲引擎中的表空間詳解

    這篇文章主要介紹了InnoDB存儲引擎中的表空間詳解,表空間內(nèi)部,所有頁按照區(qū)extent為物理單元進行劃分和管理,extent由64個物理連續(xù)的頁組成,表空間可以理解為由一個個物理相鄰的extent組成,需要的朋友可以參考下
    2023-09-09
  • MySQL同步數(shù)據(jù)Replication的實現(xiàn)步驟

    MySQL同步數(shù)據(jù)Replication的實現(xiàn)步驟

    本文主要介紹了MySQL同步數(shù)據(jù)Replication的實現(xiàn)步驟,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-03-03
  • Linux(Ubuntu)下mysql5.7.17安裝配置方法圖文教程

    Linux(Ubuntu)下mysql5.7.17安裝配置方法圖文教程

    這篇文章主要為大家詳細介紹了Linux下mysql5.7.17安裝配置方法圖文教程,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-01-01
  • MySQL的多版本并發(fā)控制MVCC的實現(xiàn)

    MySQL的多版本并發(fā)控制MVCC的實現(xiàn)

    MVCC就是多版本并發(fā)控制,本文主要介紹了MySQL的多版本并發(fā)控制MVCC的實現(xiàn),文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-12-12
  • mysql 數(shù)據(jù)庫取前后幾秒 幾分鐘 幾小時 幾天的語句

    mysql 數(shù)據(jù)庫取前后幾秒 幾分鐘 幾小時 幾天的語句

    這篇文章主要介紹了mysql 數(shù)據(jù)庫中取前后幾秒 幾分鐘 幾小時 幾天的語句,需要的朋友可以參考下
    2018-01-01

最新評論