日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷解決方案
提高M(jìn)ySQL數(shù)據(jù)庫(kù)查詢效率的技巧(二)

提高MySQL數(shù)據(jù)庫(kù)查詢效率的方法在上一篇文章中已經(jīng)為大家介紹了其中的一種方法,即提高M(jìn)ySQL數(shù)據(jù)庫(kù)查詢效率的技巧(一),這里將繼續(xù)為大家介紹MySQL數(shù)據(jù)庫(kù)查詢效率提高的方法。

我們提供的服務(wù)有:成都網(wǎng)站制作、成都網(wǎng)站設(shè)計(jì)、外貿(mào)營(yíng)銷網(wǎng)站建設(shè)、微信公眾號(hào)開(kāi)發(fā)、網(wǎng)站優(yōu)化、網(wǎng)站認(rèn)證、梅州ssl等。為成百上千企事業(yè)單位解決了網(wǎng)站和推廣的問(wèn)題。提供周到的售前咨詢和貼心的售后服務(wù),是有科學(xué)管理、有技術(shù)的梅州網(wǎng)站制作公司

隨機(jī)的獲取記錄

在某些數(shù)據(jù)庫(kù)的應(yīng)用中, 我們并不是要獲取所有的滿足條件的記錄,而只是要隨機(jī)挑選出滿足條件的記錄. 這種情況常見(jiàn)于數(shù)據(jù)業(yè)務(wù)的統(tǒng)計(jì)分析,從大容量數(shù)據(jù)庫(kù)中獲取小量的數(shù)據(jù)的場(chǎng)合.

有兩種方法可以做到

1. 常規(guī)方法,首先查詢出所有滿足條件的記錄,然后隨機(jī)的挑選出部分記錄.這種方法在滿足條件的記錄數(shù)很多時(shí)效果不理想.

2. 使用limit語(yǔ)法,先獲取滿足條件的記錄條數(shù), 然后在sql查詢語(yǔ)句中加入limit來(lái)限制只查詢滿足要求的一段記錄. 這種方法雖然要查詢兩次,但是在數(shù)據(jù)量大時(shí)反而比較高效.

示例代碼如下:

以下為引用的內(nèi)容:

//1.常規(guī)的方法
//性能瓶頸,10萬(wàn)條記錄時(shí),執(zhí)行查詢140ms, 獲取結(jié)果集500ms,其余可忽略
int CDBManager::QueryHostCache(MYSQL* connecthandle, char * channelid, int ISPtype, CDBManager::CHostCacheTable * &hostcache)
{

char selectSQL[SQL_LENGTH];
memset(selectSQL, 0, sizeof(selectSQL));
sprintf(selectSQL,"select * from HostCache where ChannelID = '%s' and ISPtype = %d", channelid, ISPtype);
if(mysql_real_query(connecthandle, selectSQL, strlen(selectSQL)) != 0) //檢索
return 0;
//獲取結(jié)果集
m_pResultSet = mysql_store_result(connecthandle);
if(!m_pResultSet) //獲取結(jié)果集出錯(cuò)
return 0;
int iAllNumRows = (int)(mysql_num_rows(m_pResultSet)); ///<所有的搜索結(jié)果數(shù)
//計(jì)算待返回的結(jié)果數(shù)
int iReturnNumRows = (iAllNumRows <= RETURN_QUERY_HOST_NUM)? iAllNumRows:RETURN_QUERY_HOST_NUM;
if(iReturnNumRows <= RETURN_QUERY_HOST_NUM)
{
//獲取逐條記錄
for(int i = 0; i {
//獲取逐個(gè)字段
m_Row = mysql_fetch_row(m_pResultSet);
if(m_Row[0] != NULL)
strcpy(hostcache.sessionid, m_Row[0]);
if(m_Row[1] != NULL)
strcpy(hostcache.channelid, m_Row[1]);
if(m_Row[2] != NULL)
hostcache.ISPtype = atoi(m_Row[2]);
if(m_Row[3] != NULL)
hostcache.externalIP = atoi(m_Row[3]);
if(m_Row[4] != NULL)
hostcache.externalPort = atoi(m_Row[4]);
if(m_Row[5] != NULL)
hostcache.internalIP = atoi(m_Row[5]);
if(m_Row[6] != NULL)
hostcache.internalPort = atoi(m_Row[6]);
}
}
else
{
//隨機(jī)的挑選指定條記錄返回
int iRemainder = iAllNumRows%iReturnNumRows; ///<余數(shù)
int iQuotient = iAllNumRows/iReturnNumRows; ///<商
int iStartIndex = rand()%(iRemainder + 1); ///<開(kāi)始下標(biāo)

//獲取逐條記錄
for(int iSelectedIndex = 0; iSelectedIndex < iReturnNumRows; iSelectedIndex++)
{
mysql_data_seek(m_pResultSet, iStartIndex + iQuotient * iSelectedIndex);
m_Row = mysql_fetch_row(m_pResultSet);
if(m_Row[0] != NULL)
strcpy(hostcache[iSelectedIndex].sessionid, m_Row[0]);
if(m_Row[1] != NULL)
strcpy(hostcache[iSelectedIndex].channelid, m_Row[1]);
if(m_Row[2] != NULL)
hostcache[iSelectedIndex].ISPtype = atoi(m_Row[2]);
if(m_Row[3] != NULL)
hostcache[iSelectedIndex].externalIP = atoi(m_Row[3]);
if(m_Row[4] != NULL)
hostcache[iSelectedIndex].externalPort = atoi(m_Row[4]);
if(m_Row[5] != NULL)
hostcache[iSelectedIndex].internalIP = atoi(m_Row[5]);
if(m_Row[6] != NULL)
hostcache[iSelectedIndex].internalPort = atoi(m_Row[6]);
}
}
//釋放結(jié)果集內(nèi)容
mysql_free_result(m_pResultSet);
return iReturnNumRows;
}

//2.使用limit版
int CDBManager::QueryHostCache(MYSQL * connecthandle, char * channelid, unsigned int myexternalip, int ISPtype, CHostCacheTable * hostcache)
{
//首先獲取滿足結(jié)果的記錄條數(shù),再使用limit隨機(jī)選擇指定條記錄返回
MYSQL_ROW row;
MYSQL_RES * pResultSet;
char selectSQL[SQL_LENGTH];
memset(selectSQL, 0, sizeof(selectSQL));

sprintf(selectSQL,"select count(*) from HostCache where ChannelID = '%s' and ISPtype = %d", channelid, ISPtype);
if(mysql_real_query(connecthandle, selectSQL, strlen(selectSQL)) != 0) //檢索
return 0;
pResultSet = mysql_store_result(connecthandle);
if(!pResultSet)
return 0;
row = mysql_fetch_row(pResultSet);
int iAllNumRows = atoi(row[0]);
mysql_free_result(pResultSet);
//計(jì)算待取記錄的上下范圍
int iLimitLower = (iAllNumRows <= RETURN_QUERY_HOST_NUM)?
0:(rand()%(iAllNumRows - RETURN_QUERY_HOST_NUM));
int iLimitUpper = (iAllNumRows <= RETURN_QUERY_HOST_NUM)?
iAllNumRows:(iLimitLower + RETURN_QUERY_HOST_NUM);
//計(jì)算待返回的結(jié)果數(shù)
int iReturnNumRows = (iAllNumRows <= RETURN_QUERY_HOST_NUM)?
iAllNumRows:RETURN_QUERY_HOST_NUM;

//使用limit作查詢
sprintf(selectSQL,"select SessionID, ExternalIP, ExternalPort, InternalIP, InternalPort "
"from HostCache where ChannelID = '%s' and ISPtype = %d limit %d, %d"
, channelid, ISPtype, iLimitLower, iLimitUpper);
if(mysql_real_query(connecthandle, selectSQL, strlen(selectSQL)) != 0) //檢索
return 0;
pResultSet = mysql_store_result(connecthandle);
if(!pResultSet)
return 0;
//獲取逐條記錄
for(int i = 0; i {
//獲取逐個(gè)字段
row = mysql_fetch_row(pResultSet);
if(row[0] != NULL)
strcpy(hostcache.sessionid, row[0]);
if(row[1] != NULL)
hostcache.externalIP = atoi(row[1]);
if(row[2] != NULL)
hostcache.externalPort = atoi(row[2]);
if(row[3] != NULL)
hostcache.internalIP = atoi(row[3]);
if(row[4] != NULL)
hostcache.internalPort = atoi(row[4]);
}
//釋放結(jié)果集內(nèi)容
mysql_free_result(pResultSet);
return iReturnNumRows;
}

上文介紹時(shí)主要以代碼的形式進(jìn)行的,對(duì)于剛剛?cè)腴T的初學(xué)者來(lái)說(shuō)可能理解起來(lái)不太容易,但還是希望大家能夠認(rèn)真的深入其中去理解,將這種方法應(yīng)用到實(shí)際工作中,提高工作效率,何樂(lè)而不為之???


文章名稱:提高M(jìn)ySQL數(shù)據(jù)庫(kù)查詢效率的技巧(二)
網(wǎng)頁(yè)網(wǎng)址:http://www.dlmjj.cn/article/dpcppsd.html