我正在构建一个web应用程序,该应用程序需要用户选择许多数据元素(可能超过50)并动态查询这些选择。查询总是针对一个(已知的)表运行。但是WHERE子句每次都会根据用户的选择而改变。
经过一堆阅读,似乎创建查询的逻辑可以在PHP级别(通过PDO准备语句)或在DB级别(在MySQL存储过程中)完成。
我的问题是,从性能的角度(缓存、代码执行、跨网络的行程等),哪一种方法更好?
MySQL 5.6
所以在PHP中(只有2个参数而不是50个参数的虚拟示例):
$query = 'SELECT * FROM users';
$cond = array();
$params = array();
if (!empty($firstname)) {
$cond[] = "firstname = ?";
$params[] = $firstname;
}
if (!empty($lastname)) {
$cond[] = "lastname = ?";
$params[] = $lastname;
}
if (count($cond)) {
$query .= ' WHERE ' . implode(' AND ', $cond);
}
$stmt = $db->prepare($query);
$stmt->execute($params);
或者在MySQL中,PHP传入参数并执行定义的存储过程(同样,这是一个简单的假示例):
delimiter //
CREATE PROCEDURE dynamic(IN firstname CHAR(64), IN lastname CHAR(64))
BEGIN
...
...(skipping over the buildup of the where clause string)
...
SET @query = CONCAT("SELECT * FROM users WHERE 1=1 ", @strwhere);
PREPARE stmt FROM @query;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
END
//
delimiter ;
从性能的角度(缓存、代码执行、跨网络传输等)来看,是更好的方法?
。