PHP / SQL:框架查询构建vs字符串连接

时间:2012-08-27 05:33:01

标签: php sql performance frameworks

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

使用框架(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语句

1 个答案:

答案 0 :(得分:2)

使用哪个适合您和您的项目团队。框架是出于某种原因编写的,所以如果它适合使用它们,但如果它不适合(并且有理由它们没有),那么它就会消失。

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

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

您还需要担心“易于阅读”,“调试”和“功能”。顶部示例更容易阅读,这在共享项目中很重要。

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

但是框架可以进行子选择吗?可以在“JOIN ON”中进行参数化吗?如果没有,字符串与PDO的连接可能更合适。

这不是一个难以回答的快速答案 - 但希望提供您需要考虑的所有要点。

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