0

考虑两种查询数据库的方法:

使用框架(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 语句(通过操作字符串)
4

1 回答 1

2

使用适合您和您的项目团队的选项。编写框架是有原因的,所以如果适合就使用它们,但如果不适合(并且有理由不这样做),那么就会放弃。

我不知道 Yii,但如果你看很多框架,他们所做的只是在一天结束时从各个部分构建一个字符串查询,希望利用参数化,但并非总是如此。因此,关于速度,字符串 concat 可能是“最快的” - 但您不太可能真正看到秒表的差异(如果您需要 1000 个查询,您可以进行基准测试,但其他功能(例如更好的错误检查或缓存)可能不公平减慢或加快 hte 结果)。

但是框架的一个优势是它们可以添加上下文相关的缓存,并且知道当您更新表 X 时需要删除查询 A、D 和 F 的缓存,但是查询 B、C 和 E 都很好。

您还需要担心“易于阅读”、“调试”和“功能”。上面的例子更容易阅读,这在共享项目中很重要。

您还需要考虑准备好的语句——框架是否使用它们?如果是这样,它是否允许您重新使用它们(而不是仅仅将它们用于语法目的)。

但是框架可以做子选择吗?它可以在“JOIN ON”中进行参数化吗?如果不是,则使用 PDO 进行字符串连接可能更合适。

这不是一个硬性和快速的答案 - 但希望能提供您需要考虑的所有要点。

建议:使用框架,除非你真的注意到它很慢,使用太多内存或者有其他很好的理由不这样做。

于 2012-08-27T06:20:38.077 回答