mysql由於它本身的小巧和操作的高效, 在資料庫應用中越來越多的被採用.我在開發乙個p2p應用的時候曾經使用mysql來儲存p2p節點,由於p2p的應用中,結點數動輒上萬個,而且節點變化頻繁,因此一定要保持查詢和插入的高效.以下是我在使用過程中做的提高效率的三個有效的嘗試.
l使用statement進行繫結查詢
使用statement可以提前構建查詢語法樹,在查詢時不再需要構建語法樹就直接查詢.因此可以很好的提高查詢的效率. 這個方法適合於查詢條件固定但查詢非常頻繁的場合.
使用方法是:
繫結, 建立乙個mysql_stmt變數,與對應的查詢字串繫結,字串中的問號代表要傳入的變數,每個問號都必須指定乙個變數.
查詢, 輸入每個指定的變數, 傳入mysql_stmt變數用可用的連線控制代碼執行.
**如下:
//1.繫結
bool cdbmanager::bindinsertstmt(mysql * connecthandle)
//2.查詢
bool cdbmanager::inserthostcache2(mysql * connecthandle, char * sessionid, char * channelid, int isptype, /
unsigned int eip, unsigned short eport, unsigned int iip, unsigned short iport)
l隨機的獲取記錄
在某些資料庫的應用中, 我們並不是要獲取所有的滿足條件的記錄,而只是要隨機挑選出滿足條件的記錄. 這種情況常見於資料業務的統計分析,從大容量資料庫中獲取小量的資料的場合.
有兩種方法可以做到
1.常規方法,首先查詢出所有滿足條件的記錄,然後隨機的挑選出部分記錄.這種方法在滿足條件的記錄數很多時效果不理想.
2.使用limit語法,先獲取滿足條件的記錄條數, 然後在sql查詢語句中加入limit來限制只查詢滿足要求的一段記錄. 這種方法雖然要查詢兩次,但是在資料量大時反而比較高效.
示例**如下:
//1.常規的方法
//效能瓶頸,10萬條記錄時,執行查詢140ms, 獲取結果集500ms,其餘可忽略
int cdbmanager::queryhostcache(mysql* connecthandle, char * channelid, int isptype, cdbmanager::chostcachetable * &hostcache)
}else
}//釋放結果集內容
mysql_free_result(m_presultset);
return ireturnnumrows;
}//2.使用limit版
int cdbmanager::queryhostcache(mysql * connecthandle, char * channelid, unsigned int myexternalip, int isptype, chostcachetable * hostcache)
//釋放結果集內容
mysql_free_result(presultset);
return ireturnnumrows;
}l使用連線池管理連線.
在有大量節點訪問的資料庫設計中,經常要使用到連線池來管理所有的連線.
一般方法是:建立兩個連線控制代碼佇列,空閒的等待使用的佇列和正在使用的佇列.
當要查詢時先從空閒佇列中獲取乙個控制代碼,插入到正在使用的佇列,再用這個控制代碼做資料庫操作,完畢後一定要從使用佇列中刪除,再插入到空閒佇列.
設計**如下:
//定義控制代碼佇列
typedef std::listconnection_handle_list;
typedef std::list::iterator connection_handle_list_it;
//連線資料庫的引數結構
class cdbparameter
;//建立兩個佇列
connection_handle_list m_lsbusylist;
///《正在使用的連線控制代碼
connection_handle_list m_lsidlelist;
///《未使用的連線控制代碼
//所有的連線控制代碼先連上資料庫,加入到空閒佇列中,等待使用.
bool cdbmanager::connect(char * host /* = "localhost" */, char * user /* = "chenmin" */, /
char * password /* = "chenmin" */, char * database /* = "hostcache" */)
}catch(...)
return true;
}//提取乙個空閒控制代碼供使用
mysql * cdbmanager::getidleconnecthandle()
else //特殊情況,閒佇列中為空,返回為空
m_listmutex.release();
return pconnecthandle;
}//從使用佇列中釋放乙個使用完畢的控制代碼,插入到空閒佇列
void cdbmanager::setidleconnecthandle(mysql * connecthandle)
//使用示例,首先獲取空閒控制代碼,利用這個控制代碼做真正的操作,然後再插回到空閒佇列
bool cdbmanager::deletehostcachebysessionid(char * sessionid)
//傳入空閒的控制代碼,做真正的刪除操作
bool cdbmanager::deletehostcachebysessionid(mysql * connecthandle, char * sessionid)
提高MySQL查詢效率的三個技巧
mysql由於它本身的小巧和操作的高效,在資料庫應用中越來越多的被採用.我在開發乙個p2p應用的時候曾經使用mysql來儲存p2p節點,由於p2p的應用中,結點數動輒上萬個,而且節點變化頻繁,因此一定要保持查詢和插入的高效.以下是我在使用過程中做的提高效率的三個有效的嘗試.使用statement進行...
提高MySQL 查詢效率的三個技巧
提高mysql 查詢效率的三個技巧 發表日期 2007 11 05 更新日期 2007 11 05 作者文章閱讀次數 1988 源自 浮世草子 個人 標籤 資料庫 您認為本文應該得 123 45共有5人參與打分 列印 收藏 討論 投訴 249b414e 3dd4 4920 8b7c 16725710...
提高MySQL 查詢效率的三個技巧
mysql由於它本身的小巧和操作的高效,在資料庫應用中越來越多的被採用.我在開發乙個p2p應用的時候曾經使用mysql來儲存p2p節點,由於p2p的應用中,結點數動輒上萬個,而且節點變 化頻繁,因此一定要保持查詢和插入的高效.以下是我在使用過程中做的提高效率的三個有效的嘗試.1.使用statemen...