提高mysql 查詢效率的三個技巧
發表日期:2007-11-05
更新日期:2007-11-05
作者文章閱讀次數:1988
源自:浮世草子 (個人**) 標籤:資料庫
您認為本文應該得 123
45共有5人參與打分
列印|收藏|討論|投訴
249b414e-3dd4-4920-8b7c-1672571096a3
mysql由於它本身的小巧和操作的高效, 在資料庫應用中越來越多的被採用.我在開發乙個p2p應用的時候曾經使用mysql來儲存p2p節點,由於p2p的應用中,結點數動輒上萬個,而且節點變化頻繁,因此一定要保持查詢和插入的高效.以下是我在使用過程中做的提高效率的三個有效的嘗試. 1. 使用statement進行繫結查詢 2. 隨機的獲取記錄 3. 使用連線池管理連線.
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由於它本身的小巧和操作的高效,在資料庫應用中越來越多的被採用.我在開發乙個p2p應用的時候曾經使用mysql來儲存p2p節點,由於p2p的應用中,結點數動輒上萬個,而且節點變 化頻繁,因此一定要保持查詢和插入的高效.以下是我在使用過程中做的提高效率的三個有效的嘗試.1.使用statemen...
提高MySQL 查詢效率的三個技巧
mysql由於它本身的小巧和操作的高效,在資料庫應用中越來越多的被採用.我在開發乙個p2p應用的時候曾經使用mysql來儲存p2p節點,由於p2p的應用中,結點數動輒上萬個,而且節點變化頻繁,因此一定要保持查詢和插入的高效.以下是我在使用過程中做的提高效率的三個有效的嘗試.l使用statement進...