在做數(shù)據(jù)庫查詢過程中,遇到跨表查詢,即需要用到另一張表的ID來列出當(dāng)前表的記錄,通常情況我們會想到跨表查詢,結(jié)合子查詢只要使用一句SQL語就可以解決問題,例如:$sql="select * from table1 where Id not in(select QuestionId from table2 where UserName='".$UserName."')",大多數(shù)初級開發(fā)者都認為,用查詢關(guān)鍵肯定是最優(yōu)的實現(xiàn)方法,所以大都初級開發(fā)都會用到in或exists等語句,對數(shù)據(jù)記錄比較少的兩張表查詢,但沒有明顯示區(qū)別,但是當(dāng)記錄才達到幾萬條,同時有十幾個人訪問,就會明顯感覺到延時,所謂的卡機,就是算法執(zhí)行的效率不高出現(xiàn)的原因,針對這樣的情況,我們建議開發(fā)者盡量避免使用這些關(guān)鍵詞那么用什么方法解決這種問題呢?
解決方法是,我們可以用最原始的嵌套循環(huán),第一把子查詢的中的ID一個個讀出來,再在table1 中進行查詢,這樣執(zhí)行的速度比較快.代碼如下所示:
$sql="select QuestionId from table2 where UserName='".$UserName."'";
$result=$conn->query($sql);
if ($result)
{
while($row = $result->fetch_array())
{
$psql ="select * from table1 where id=".$row['QId'];
$presult = $conn->query($psql);
if ($presult){
$rowp = $presult->fetch_array();
…… }
}
百恒技術(shù)工程師建議大家,若是小型數(shù)據(jù)查詢,使用in,exists是沒有任何問題,盡量縮小雙邊的查詢范圍,以減輕資源的消耗.對于大型數(shù)據(jù)查詢,盡量不要用.
希望此文章能對廣開發(fā)者有所幫助,原創(chuàng)文章出自:百恒網(wǎng)絡(luò) 如轉(zhuǎn)載請注明出處!專業(yè),專注于南昌網(wǎng)站建設(shè),為用戶提供高品質(zhì)的網(wǎng)絡(luò)產(chǎn)品及優(yōu)質(zhì)服務(wù)是我們始終的追求.