【问题标题】:PHP/SQL: framework query building vs string concatenationPHP/SQL:框架查询构建与字符串连接
【发布时间】:2012-08-27 05:33:00
【问题描述】:

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

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

【问题讨论】:

  • 即使在 Yii 示例中,仍然会有代码在后台连接完全相同的字符串并使用 PDO 或其他适配器将其发送到数据库。所以性能问题是一种自我回答。

标签: php sql performance frameworks


【解决方案1】:

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

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

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

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-07
    • 2014-11-14
    相关资源
    最近更新 更多