用mysql的api重復查詢同一個表很多次(3000次左右),和查詢3000個表,所消耗的時間相差好大,前者只要4秒,后者70多秒。
我的表結構都是相同的,資料量差不多的。也就是說用同樣的陳述句select * from SHSE_000905_min order by updatetime desc limit 500查詢一個表兩次和查詢兩個不同的表所耗時間上相差很大,這是為什么?
代碼如下:
MYSQL_ROW m_row;
MYSQL_RES *m_res = NULL; // 資料結果集
time_t t1, t2;
t1 = time(NULL);
string sql1 = "select * from (select * from ";
string sql2 = " order by updatetime desc limit ";
string sql3 = ") a ORDER BY updatetime;";
string sql;
dataMin data;
for (int i = 0; symList[i] != NULL; i++){
//cout << i << endl;
string sqltb = symList[i];
int id = sqltb.find(".");
sqltb[id] = '_';
sql = sql1 + sqltb + dType + sql2 + "500" + sql3;
//sql = sql1 + "shse_600519_min"+ sql2 + "500" + sql3;
mysql_query(&mysql, sql.c_str());
m_res = mysql_store_result(&mysql);
while (m_row = mysql_fetch_row(m_res)){
}
mysql_free_result(m_res);
}
t2 = time(NULL);
printf("運行時間是: %ld", t2 - t1);
這是查詢i個表(總共近3000個表),運行時間70多秒.
MYSQL_ROW m_row;
MYSQL_RES *m_res = NULL; // 資料結果集
time_t t1, t2;
t1 = time(NULL);
string sql1 = "select * from (select * from ";
string sql2 = " order by updatetime desc limit ";
string sql3 = ") a ORDER BY updatetime;";
string sql;
dataMin data;
for (int i = 0; symList[i] != NULL; i++){
//cout << i << endl;
string sqltb = symList[i];
int id = sqltb.find(".");
sqltb[id] = '_';
//sql = sql1 + sqltb + dType + sql2 + "500" + sql3;
sql = sql1 + "shse_600519_min"+ sql2 + "500" + sql3;
mysql_query(&mysql, sql.c_str());
m_res = mysql_store_result(&mysql);
while (m_row = mysql_fetch_row(m_res)){
}
mysql_free_result(m_res);
}
t2 = time(NULL);
printf("運行時間是: %ld", t2 - t1);
這是重復查詢一個表,查詢3000次,運行時間是4秒。
uj5u.com熱心網友回復:
以下內容僅供參考:在檔案大小相同的前提下:
讀剛讀過的檔案比頭次讀沒讀過的檔案快
讀轉速快的硬碟上的檔案比讀轉速慢的硬碟上的檔案快
讀沒有磁盤碎片的檔案比讀有磁盤碎片的檔案快
讀檔案不處理比邊讀邊處理快
單執行緒從頭到尾一次讀檔案比多執行緒分別讀檔案各部分快(非固態硬碟上)
讀固態硬碟上的檔案比讀普通硬碟上的檔案快
uj5u.com熱心網友回復:
因為mysql打開一個表是消耗資源和時間的。
剛剛操作過的表,mysql會快取(類似壓堆疊),如果反復查詢這一個,mysql可以立刻得到這個表(通過出堆疊立刻得到)。
壓堆疊出堆疊可以說是最計算機訪問資料中速度最快的方式。
但是如果你要換一個表,就會影響這個快取序列。如果連續換表,mysql會忙于快取原來的,查找并打開新的,再快取原來的。肯定很費時。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/153462.html
標籤:數據庫
