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

mysql數(shù)據(jù)庫(kù)查詢優(yōu)化 mysql效率

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

  使用連接池管理連接.
在有大量節(jié)點(diǎn)訪問的數(shù)據(jù)庫(kù)設(shè)計(jì)中,經(jīng)常要使用到連接池來管理所有的連接.
一般方法是:建立兩個(gè)連接句柄隊(duì)列,空閑的等待使用的隊(duì)列和正在使用的隊(duì)列.
當(dāng)要查詢時(shí)先從空閑隊(duì)列中獲取一個(gè)句柄,插入到正在使用的隊(duì)列,再用這個(gè)句柄做數(shù)據(jù)庫(kù)操作,完畢后一定要從使用隊(duì)列中刪除,再插入到空閑隊(duì)列.
設(shè)計(jì)代碼如下: 

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

//定義句柄隊(duì)列 
typedef std::list<MYSQL *> CONNECTION_HANDLE_LIST; 
typedef std::list<MYSQL *>::iterator CONNECTION_HANDLE_LIST_IT; 

//連接數(shù)據(jù)庫(kù)的參數(shù)結(jié)構(gòu) 
class CDBParameter              

public: 
       char *host;                                 ///<主機(jī)名 
       char *user;                                 ///<用戶名 
       char *password;                         ///<密碼 
       char *database;                           ///<數(shù)據(jù)庫(kù)名 
       unsigned int port;                 ///<端口,一般為0 
       const char *unix_socket;      ///<套接字,一般為NULL 
       unsigned int client_flag; ///<一般為0 
}; 

//創(chuàng)建兩個(gè)隊(duì)列 
CONNECTION_HANDLE_LIST m_lsBusyList;                ///<正在使用的連接句柄 
CONNECTION_HANDLE_LIST m_lsIdleList;                  ///<未使用的連接句柄 

//所有的連接句柄先連上數(shù)據(jù)庫(kù),加入到空閑隊(duì)列中,等待使用. 
bool CDBManager::Connect(char * host /* = "localhost" */, char * user /* = "chenmin" */, \ 
                                           char * password /* = "chenmin" */, char * database /* = "HostCache" */) 

       CDBParameter * lpDBParam = new CDBParameter(); 
       lpDBParam->host = host; 
       lpDBParam->user = user; 
       lpDBParam->password = password; 
       lpDBParam->database = database; 
       lpDBParam->port = 0; 
       lpDBParam->unix_socket = NULL; 
       lpDBParam->client_flag = 0; 
       try 
       { 
              //連接 
              for(int index = 0; index < CONNECTION_NUM; index++) 
              { 
                     MYSQL * pConnectHandle = mysql_init((MYSQL*) 0);     //初始化連接句柄 
                     if(!mysql_real_connect(pConnectHandle, lpDBParam->host, lpDBParam->user, lpDBParam->password,\ 
       lpDBParam->database,lpDBParam->port,lpDBParam->unix_socket,lpDBParam->client_fla)) 
                            return false; 
//加入到空閑隊(duì)列中 
                     m_lsIdleList.push_back(pConnectHandle); 
              } 
       } 
       catch(...) 
       { 
              return false; 
       } 
       return true; 


//提取一個(gè)空閑句柄供使用 
MYSQL * CDBManager::GetIdleConnectHandle() 

       MYSQL * pConnectHandle = NULL; 
       m_ListMutex.acquire(); 
       if(m_lsIdleList.size()) 
       { 
              pConnectHandle = m_lsIdleList.front();        
              m_lsIdleList.pop_front(); 
              m_lsBusyList.push_back(pConnectHandle); 
       } 
       else //特殊情況,閑隊(duì)列中為空,返回為空 
       { 
              pConnectHandle = 0; 
       } 
       m_ListMutex.release(); 

       return pConnectHandle; 


//從使用隊(duì)列中釋放一個(gè)使用完畢的句柄,插入到空閑隊(duì)列 
void CDBManager::SetIdleConnectHandle(MYSQL * connecthandle) 

       m_ListMutex.acquire(); 
       m_lsBusyList.remove(connecthandle); 
       m_lsIdleList.push_back(connecthandle); 
       m_ListMutex.release(); 

//使用示例,首先獲取空閑句柄,利用這個(gè)句柄做真正的操作,然后再插回到空閑隊(duì)列 
bool CDBManager::DeleteHostCacheBySessionID(char * sessionid) 

       MYSQL * pConnectHandle = GetIdleConnectHandle(); 
       if(!pConnectHandle) 
              return 0; 
       bool bRet = DeleteHostCacheBySessionID(pConnectHandle, sessionid); 
       SetIdleConnectHandle(pConnectHandle); 
       return bRet; 

//傳入空閑的句柄,做真正的刪除操作 
bool CDBManager::DeleteHostCacheBySessionID(MYSQL * connecthandle, char * sessionid) 

       char deleteSQL[SQL_LENGTH]; 
       memset(deleteSQL, 0, sizeof(deleteSQL)); 
       sprintf(deleteSQL,"delete from HostCache where SessionID = '%s'", sessionid); 
       if(mysql_query(connecthandle,deleteSQL) != 0) //刪除 
              return false; 
       return true; 

相關(guān)文章

  • Mysql5 字符集編碼問題解決

    Mysql5 字符集編碼問題解決

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

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

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

    MySQL開啟慢查詢方法及實(shí)例

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

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

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

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

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

    InnoDB存儲(chǔ)引擎中的表空間詳解

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

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

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

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

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

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

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

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

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

最新評(píng)論