自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

提高M(jìn)ySQL數(shù)據(jù)庫(kù)查詢效率的技巧(二)

數(shù)據(jù)庫(kù) MySQL
MySQL數(shù)據(jù)庫(kù)查詢是數(shù)據(jù)庫(kù)應(yīng)用中一個(gè)比較重要的功能,MySQL數(shù)據(jù)庫(kù)查詢的快慢就直接影響著數(shù)據(jù)庫(kù)操作的效率,拿么怎樣來(lái)提高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ù)查詢效率提高的方法。

隨機(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<iReturnNumRows; 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<iReturnNumRows; 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è)而不為之???

【編輯推薦】

  1. 讓MySQL數(shù)據(jù)庫(kù)服務(wù)器支持遠(yuǎn)程連接
  2. MySQL數(shù)據(jù)庫(kù)備份的基礎(chǔ)知識(shí)大全
  3. MySQL數(shù)據(jù)庫(kù)鎖機(jī)制的相關(guān)原理簡(jiǎn)介
責(zé)任編輯:迎迎 來(lái)源: 賽迪網(wǎng)
相關(guān)推薦

2011-04-02 09:33:13

MySQL數(shù)據(jù)庫(kù)查詢效率

2011-04-02 09:23:19

MySQL數(shù)據(jù)庫(kù)查詢效率

2010-04-07 17:45:22

Oracle位圖索引

2010-10-27 14:15:44

Oracle數(shù)據(jù)庫(kù)效率

2010-08-27 13:27:50

DB2備份恢復(fù)

2023-10-09 18:13:14

MySQL數(shù)據(jù)庫(kù)查詢

2009-05-15 10:11:55

數(shù)據(jù)庫(kù)查詢查詢性能分頁(yè)瀏覽

2011-04-11 16:50:13

Oracle數(shù)據(jù)庫(kù)索引

2011-08-03 18:01:54

MySQL數(shù)據(jù)庫(kù)提高查詢速度

2018-10-24 15:55:19

MySQL數(shù)據(jù)庫(kù)技巧

2018-01-10 09:33:18

數(shù)據(jù)庫(kù)SQL查詢優(yōu)化Java Web

2018-05-24 08:47:15

數(shù)據(jù)存儲(chǔ)技巧

2012-07-06 09:00:34

MySQL

2011-03-17 14:48:49

高級(jí)掃描數(shù)據(jù)庫(kù)查詢

2009-06-30 15:54:00

數(shù)據(jù)庫(kù)訪問(wèn)JSP

2010-05-27 17:16:20

MySQL數(shù)據(jù)庫(kù)

2010-05-31 14:50:49

MySQL數(shù)據(jù)庫(kù)性能

2010-11-22 13:23:52

MySQL數(shù)據(jù)庫(kù)優(yōu)化

2024-12-03 09:28:54

元組數(shù)據(jù)庫(kù)

2009-07-06 21:20:34

SQL Server數(shù)
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)