缓存PDO准备好的语句

时间:2011-11-20 15:04:10

标签: php mysql pdo

保存PDO预处理语句以便在会话中重用是否有任何意义?

我正在构建一个使用MySQL全文查询的网站,我将它放在我的PHP中,如

SELECT * FROM table 
WHERE MATCH (title) AGAINST ($search_string IN BOOLEAN MODE) AND 
      MATCH (keywords) AGAINST ($keywords IN BOOLEAN MODE)
ORDER BY $order_by $asc_desc

当我准备并使用绑定参数执行它时,运行这种查询似乎需要花费更长的时间,而不是在我准备和执行包含值的查询字符串时。但我需要使用预准备语句来防止SQL注入的风险。

在任何会话中,我很可能会使用不同的参数值多次运行相同的查询。一旦创建PDOStatement对象(例如在会话中),保存它是否合理?如果是这样,最好的方法是什么?将每个预准备语句保存在创建的关联数组中是不是一个好习惯,SQL查询字符串是每个语句的关键?


在进一步阅读时,我发现你不能将绑定参数用于语句的ORDER BY和ASC / DESC部分。当我用固定值替换它们时,性能会提高。

2 个答案:

答案 0 :(得分:3)

将准备语句存储到会话中以获得可重用的目的没有任何好处,
昂贵的成本是在查询执行本身。

答案 1 :(得分:0)

如果您抓取的数据不断变化,那么在您检索结果集后不久,缓存结果集可能不再有效。

但是,如果您的数据看起来是静态的:

session_start();
$_SESSION['cachedResultSet'] = $fetchedResultset;
echo $_SESSION['cachedResultSet'][0][0]; 
# above statement `echo ...` depends on how your result is, be it an array or object

我认为在一定程度上将结果集存储在会话变量中是可以接受的,但也许它取决于(遗憾地是多余的)数据是否快速变化或者您获取此特定结果集的频率等等...... / p>