成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

提高MySQL數據庫查詢效率的技巧(二)

數據庫 MySQL
MySQL數據庫查詢是數據庫應用中一個比較重要的功能,MySQL數據庫查詢的快慢就直接影響著數據庫操作的效率,拿么怎樣來提高MySQL數據庫查詢效率呢?

提高MySQL數據庫查詢效率的方法在上一篇文章中已經為大家介紹了其中的一種方法,即提高MySQL數據庫查詢效率的技巧(一),這里將繼續為大家介紹MySQL數據庫查詢效率提高的方法。

隨機的獲取記錄

在某些數據庫的應用中, 我們并不是要獲取所有的滿足條件的記錄,而只是要隨機挑選出滿足條件的記錄. 這種情況常見于數據業務的統計分析,從大容量數據庫中獲取小量的數據的場合.

有兩種方法可以做到

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

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

示例代碼如下:

以下為引用的內容:

//1.常規的方法
//性能瓶頸,10萬條記錄時,執行查詢140ms, 獲取結果集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;
//獲取結果集
m_pResultSet = mysql_store_result(connecthandle);
if(!m_pResultSet) //獲取結果集出錯
return 0;
int iAllNumRows = (int)(mysql_num_rows(m_pResultSet)); ///<所有的搜索結果數
//計算待返回的結果數
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++)
{
//獲取逐個字段
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
{
//隨機的挑選指定條記錄返回
int iRemainder = iAllNumRows%iReturnNumRows; ///<余數
int iQuotient = iAllNumRows/iReturnNumRows; ///<商
int iStartIndex = rand()%(iRemainder + 1); ///<開始下標

//獲取逐條記錄
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]);
}
}
//釋放結果集內容
mysql_free_result(m_pResultSet);
return iReturnNumRows;
}

//2.使用limit版
int CDBManager::QueryHostCache(MYSQL * connecthandle, char * channelid, unsigned int myexternalip, int ISPtype, CHostCacheTable * hostcache)
{
//首先獲取滿足結果的記錄條數,再使用limit隨機選擇指定條記錄返回
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);
//計算待取記錄的上下范圍
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);
//計算待返回的結果數
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++)
{
//獲取逐個字段
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]);
}
//釋放結果集內容
mysql_free_result(pResultSet);
return iReturnNumRows;
}

上文介紹時主要以代碼的形式進行的,對于剛剛入門的初學者來說可能理解起來不太容易,但還是希望大家能夠認真的深入其中去理解,將這種方法應用到實際工作中,提高工作效率,何樂而不為之啊?

【編輯推薦】

  1. 讓MySQL數據庫服務器支持遠程連接
  2. MySQL數據庫備份的基礎知識大全
  3. MySQL數據庫鎖機制的相關原理簡介
責任編輯:迎迎 來源: 賽迪網
相關推薦

2011-04-02 09:23:19

MySQL數據庫查詢效率

2011-04-02 09:33:13

MySQL數據庫查詢效率

2010-04-07 17:45:22

Oracle位圖索引

2010-10-27 14:15:44

Oracle數據庫效率

2010-08-27 13:27:50

DB2備份恢復

2011-04-11 16:50:13

Oracle數據庫索引

2009-05-15 10:11:55

數據庫查詢查詢性能分頁瀏覽

2018-05-24 08:47:15

數據存儲技巧

2023-10-09 18:13:14

MySQL數據庫查詢

2011-08-03 18:01:54

MySQL數據庫提高查詢速度

2018-01-10 09:33:18

數據庫SQL查詢優化Java Web

2018-10-24 15:55:19

MySQL數據庫技巧

2009-06-30 15:54:00

數據庫訪問JSP

2012-07-06 09:00:34

MySQL

2011-03-17 14:48:49

高級掃描數據庫查詢

2009-12-22 19:14:36

WCF效率

2024-12-03 09:28:54

元組數據庫

2010-05-31 14:50:49

MySQL數據庫性能

2020-11-26 10:29:01

Redis

2010-11-22 13:23:52

MySQL數據庫優化
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产91综合| 欧美一区二区三区在线 | 日韩在线| 日本不卡免费新一二三区 | 国产一区二区在线免费 | 亚洲欧美日本在线 | 亚洲日日 | 国产精品一卡二卡三卡 | 久久i| 999久久久| 四虎影院免费在线播放 | 国产精品mv在线观看 | 日本不卡一区二区三区在线观看 | 爱爱视频在线观看 | 亚洲精品一区中文字幕乱码 | 国产成人精品一区二区 | 五月激情婷婷六月 | 久久久久久99 | 日韩成人国产 | 成人午夜精品一区二区三区 | 夜久久 | www.亚洲精品| 亚洲欧美一区二区三区在线 | 毛片电影 | 亚洲国产aⅴ成人精品无吗 亚洲精品久久久一区二区三区 | 国产精品国产成人国产三级 | 视频精品一区 | 亚洲理论在线观看电影 | 99re66在线观看精品热 | av成人在线观看 | www亚洲一区 | 国产精品福利视频 | 婷婷午夜天 | 久久91av| 午夜性色a√在线视频观看9 | 国产精品福利在线观看 | 色视频www在线播放国产人成 | 天天天天操 | 嫩草国产 | 奇色影视| 男女网站免费 |