提高MySQL 查詢效率的三個技巧

2021-04-13 22:51:21 字數 3301 閱讀 6687

提高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進...