2012-08-27 64 views
0

考慮2種方式查詢數據庫:PHP/SQL:框架查詢建築VS字符串連接

一個框架(Yii的):

$user = Yii::app()->db->createCommand() 
->select('id, username, profile') 
->from('tbl_user u') 
->join('tbl_profile p', 'u.id=p.user_id') 
->where('id=:id', array(':id'=>$id)) 
->queryRow(); 

隨着字符串連接(分離SQL語句的各個部分):

$columns = "id,username,profile"; // or =implode(",",$column_array); 
//you can always use string functions to wrap quotes around each columns/tables 
$join = "INNER JOIN tbl_profile p ON u.id=p.user_id"; 
$restraint = "WHERE id=$id ";//$id cleaned with intval() 
$query="SELECT $columns FROM tbl_user u {$restraint}{$join}"; 
//use PDO to execute query... and loop through records... 

實施例與字符串連接用於分頁:

$records_per_page=20; 
$offset = 0; 
if (isset($_GET['p'])) $offset = intval($_GET['p'])*$records_per_page; 
Squery="SELECT * FROM table LIMIT $offset,$records_per_page"; 

哪種方法有更好的性能?

  • PHP的PDO允許代碼可以移植到不同的數據庫
  • 第二方法可被包裹在這樣沒有代碼被不斷重複的功能。
  • 字符串連接允許編程的方式構建複雜的SQL語句(通過操縱字符串)
+0

即使在Yii示例中,仍然會有幕後代碼將完全相同的字符串連接起來,並使用PDO或其他適配器將其發送到數據庫。所以性能問題是一種自我回答。 – deceze

回答

2

使用哪種更適合你和你的項目團隊。框架是爲了某種原因而編寫的,所以如果它適合使用它們,但是如果它不存在(並且有原因,它們不會)然後就會消失。

我不知道Yii,但是如果你看了很多框架,他們所做的一切就是在一天結束時從零件上建立一個字符串查詢,希望利用參數化,但並非總是如此。因此,對於速度來說,字符串concat可能是「最快的」 - 但是你不可能真正看到秒錶的差異(如果你需要1000次查詢,你可以進行基準測試,但其他功能,如更好的錯誤檢查或緩存可能不公平緩慢或加快結果)。

但是,框架的一個好處是它們可以添加上下文相關的緩存,並知道何時更新表X,查詢A,D和F的緩存需要刪除,但查詢B,C和E都很好。

你也有「易於閱讀」和「調試」和「功能」擔心。頂部的示例更容易閱讀,這在共享項目中很重要。

您還需要考慮準備好的語句 - 框架是否使用它們?如果是這樣,它是否允許您重新使用它們(而不是僅僅將它們用於語法目的)。

但框架可以做子選擇嗎?它可以在「JOIN ON」中進行參數化嗎?如果不是,用PDO進行字符串連接可能更合適。

這不是一個硬性和快速的答案 - 但希望提供您需要考慮的所有要點。

推薦:使用框架,除非你真的注意到它很慢,使用太多的內存或有其他一些不好的理由。