最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

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

復制代碼 代碼如下:

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

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

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

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

//所有的連接句柄先連上數(shù)據(jù)庫,加入到空閑隊列中,等待使用. 
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; 
//加入到空閑隊列中 
                     m_lsIdleList.push_back(pConnectHandle); 
              } 
       } 
       catch(...) 
       { 
              return false; 
       } 
       return true; 


//提取一個空閑句柄供使用 
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 //特殊情況,閑隊列中為空,返回為空 
       { 
              pConnectHandle = 0; 
       } 
       m_ListMutex.release(); 

       return pConnectHandle; 


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

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

//使用示例,首先獲取空閑句柄,利用這個句柄做真正的操作,然后再插回到空閑隊列 
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; 

相關文章

  • SQL實現(xiàn)LeetCode(196.刪除重復郵箱)

    SQL實現(xiàn)LeetCode(196.刪除重復郵箱)

    這篇文章主要介紹了SQL實現(xiàn)LeetCode(196.刪除重復郵箱),本篇文章通過簡要的案例,講解了該項技術的了解與使用,以下就是詳細內(nèi)容,需要的朋友可以參考下
    2021-08-08
  • mysql 按中文字段排序

    mysql 按中文字段排序

    在MySQL中,進行中文排序和查找的時候,對漢字的排序和查找結(jié)果是錯誤的。 這種情況在MySQL的很多版本中都存在。
    2009-01-01
  • Mysql BinLog存儲機制與數(shù)據(jù)恢復方式

    Mysql BinLog存儲機制與數(shù)據(jù)恢復方式

    這篇文章主要介紹了Mysql BinLog存儲機制與數(shù)據(jù)恢復方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-06-06
  • MYSQL Left Join優(yōu)化(10秒優(yōu)化到20毫秒內(nèi))

    MYSQL Left Join優(yōu)化(10秒優(yōu)化到20毫秒內(nèi))

    在實際開發(fā)中,相信大多數(shù)人都會用到join進行連表查詢,但是有些人發(fā)現(xiàn),用join好像效率很低,而且驅(qū)動表不同,執(zhí)行時間也不同。那么join到底是如何執(zhí)行的呢,本文就詳細的介紹一下
    2021-12-12
  • 同時運行多個MySQL服務器的方法

    同時運行多個MySQL服務器的方法

    在同一臺機器上運行多個有些情況下你可能想要在同一臺機器上運行多個服務器。例如,你可能想要測試一個新的MySQL版本而讓你現(xiàn)有生產(chǎn)系統(tǒng)的設置不受到干擾, 或你可能是想要為不同的客戶提供獨立的MySQL安裝一個因特網(wǎng)服務供應商。
    2008-05-05
  • Mysql字符集utf8和utf8mb4詳解

    Mysql字符集utf8和utf8mb4詳解

    文章介紹了MySQL中utf8和utf8mb4兩種字符集的區(qū)別,包括編碼方式、存儲空間、索引長度以及支持的Unicode字符范圍,同時,通過創(chuàng)建兩個表并插入數(shù)據(jù)進行存儲長度的比較,驗證了上述理論
    2024-12-12
  • Mysql下自動刪除指定時間以前的記錄的操作方法

    Mysql下自動刪除指定時間以前的記錄的操作方法

    這篇文章主要介紹了MySQL下自動刪除指定時間以前的記錄的操作方法,需要的朋友可以參考下
    2018-08-08
  • 利用JuiceFS使MySQL?備份驗證性能提升?10?倍

    利用JuiceFS使MySQL?備份驗證性能提升?10?倍

    這篇文章主要介紹了如何讓?MySQL?備份驗證性能提升?10?倍,JuiceFS?非常適合用來做?MySQL?物理備份,通過不斷調(diào)整?XtraBackup?的參數(shù)和?JuiceFS?的掛載參數(shù),在一個小時內(nèi)將時間縮短到原先的?1/10,下文一起來看相關內(nèi)容的詳細介紹吧
    2022-03-03
  • mysql分表和分區(qū)的區(qū)別淺析

    mysql分表和分區(qū)的區(qū)別淺析

    這篇文章主要介紹了mysql分表和分區(qū)的區(qū)別淺析,并對它們之間的相同做了分析,需要的朋友可以參考下
    2014-07-07
  • 一文深入探討MySQL是如何解決幻讀問題

    一文深入探討MySQL是如何解決幻讀問題

    SQL標準中定義了4種隔離級別,分別是讀未提交、讀已提交、可重復讀以及序列化。不同的隔離級別下,本文將重點探討下MySQL是如何解決幻讀問題的,需要的朋友可以跟著小編一起來探討一下
    2023-07-07

最新評論

安化县| 伽师县| 瑞昌市| 页游| 邢台县| 凤凰县| 大渡口区| 平南县| 藁城市| 翁牛特旗| 唐河县| 西安市| 屏东县| 宣化县| 阜新市| 多伦县| 东辽县| 册亨县| 越西县| 噶尔县| 吴旗县| 沾益县| 汨罗市| 内乡县| 肃南| 广西| 阿克陶县| 垦利县| 茌平县| 睢宁县| 股票| 兰州市| 灌云县| 栾城县| 泗阳县| 二连浩特市| 织金县| 辛集市| 黄平县| 察哈| 武胜县|