2014-10-19 15 views
1

想象有兩個表,「用戶」和「等級」 SQLite數據庫,一個保存用戶名和他們的數字(和用戶ID)級別,其他持有相同等級號碼和姓名的等級。目標是輸出一個帶有排名和用戶名(以及它們的用戶名)的html表。多個數據庫queryception性能

<?php 
$db1 = new PDO('sqlite:database'); 
$db2 = new SQLite3('database'); 
$result = $db1->query("SELECT * FROM users ORDER BY rank DESC"); 

echo '<table><tr><td>rank</td><td>username</td><td>id</td></tr>'; 
$data = ""; 
foreach($result as $row){ 
    $data .= 
    '<tr><td>'.$db2->querySingle("SELECT rankname FROM ranks WHERE ranknumber =".$row['rank']).'</td>'. 
    '<td>'.$row['name'].'</td>'. 
    '<td>'.$row['id'].'</td></tr>'; 
} 
echo $data; 
echo "</table>"; 
?> 

這段代碼在小範圍內工作得非常好,問題是一旦數據庫被高度填充,它的性能就會受到影響。基本上它是對第一個查詢的每個輸出行向數據庫發出一個新的請求,對吧?我添加了$ data數據,而不是逐一回顯每一行,以防萬一它可能會減少路上某處的請求,但我不確定它是否會帶來任何積極的影響。我與數據庫處理和PHP太缺乏經驗,知道該代碼會是多少應變把服務器和/或網絡上比較簡單地具有側2個查詢側,將我的代碼執行實際上成百上千的數據庫請求,以及如何會影響性能嗎?另外,如果不好,我能做些什麼呢?如果沒有性能問題,是否有任何不同的方式來實現相同的結果?

更重要的是,如果我也來自一個完全不同的非SQLite的(MySQL的)數據庫完全取代了顯示名稱的用戶名? 201查詢顯示100個用戶,這是否意味着大量增加資源使用量?

+3

聽起來像是「加入」的工作。如果您還不熟悉SQL連接,請參閱以下教程:http://www.tutorialspoint.com/sqlite/sqlite_using_joins.htm。就「效率」而言:您通常希望使*少數*查詢成爲可能。因此建議考慮使用連接。 – paulsm4 2014-10-20 02:50:47

+1

@ paulsm4加入了這個伎倆,就像一個魅力一樣,就好像我的所有數據都在一張桌子上一樣,謝謝! – KittenCodings 2014-10-20 07:07:38

回答

1

根據經驗,一般情況下,發出查詢是一種昂貴的操作 - 它涉及到大量的工作在數據庫端(解析,語法檢查,權限檢查,構建執行計劃,磁盤I/O,網絡流量往返於DB等)。

當然,沒有任何規則是100%防彈的,你應該總是測試你的特定用例,但是在大多數情況下,執行單個「大」查詢將比執行N個「小」查詢好得多。在您的用例中,您可以使用join語法在單個查詢中獲取所需的所有結果:

SELECT users.*, ranks.rankname 
FROM  users 
JOIN  ranks ON users.rank = ranks.ranknumber 
ORDER BY users.rank DESC 
+0

哇,SQL查詢是這樣一個又老又容易在表面上使用的功能,我不認爲它實際上是這樣執行了沉重的動作......然後我的「queryception」另一個查詢的每個結果執行查詢會一個非常糟糕的主意,這就是我所害怕的以及回答這個問題的答案,謝謝。此外,JOIN的伎倆對我來說在同一個數據庫中的兩個表,現在我試圖找出如何安裝其他數據庫的我的查詢,非常感謝,你讓我的日子好,我希望你能有一個好的也是 – KittenCodings 2014-10-20 07:04:53