作者DarkKiller (System hacked)
看板PHP
标题Re: 请多用 PDO...
时间Sun May 26 09:31:48 2013
※ 引述《DarkKiller (System hacked)》之铭言:
: 另外一个是效能的问题...
在 MySQL 里,SQL Parser 其实不太快,以 BBS 为例子,想要列出像是
http://webptt.com/cn.aspx?n=bbs/PHP/index.html 这样的页面,可能是:
$p = $db->prepare(
'SELECT * FROM `posts` WHERE ' .
'`board_id` = ? AND `deleted` = 0 ORDER BY `created_at` DESC '
'LIMIT 20;'
);
$p->execute(array($php_board_id));
然後再跑 loop 找出每篇文章的推文数量:(这边简化成「数量」而非「分数」)
$p = $db->prepare(
'SELECT COUNT(*) FROM `pushs` WHERE ' .
'`post_id` = ?;'
);
foreach ($p->fetch(PDO::FETCH_OBJ) AS $post) {
$p->execute(array($post->post_id));
list($num) = $p->fetch(PDO::FETCH_NUM);
// 对 $num 做些事情...
}
SQL Parser 需要分析这个 SELECT 使用哪个 index 会比较有效率,在资料库
存取时可不可以用某些 optimization,这些都是要算的。
在这边可以看到 $p 被重复使用,这对於 database server 可以减少大量的
SQL Parser 分析时间。
另外有人会问为什麽不用 JOIN、GROUP BY 或是 sub-query 做,答案是资料库
效能考量。
在 InnoDB 里,所有的 query (即使是 SELECT) 都是一笔 transaction,只是
MySQL 有对非 BEGIN-COMMIT/ROLLBACK 类型的 SQL query 最佳化。
但这不代表 SELECT 就没有 lock,这也就是效能的考量:能够避免就还是尽量
避免 SQL query 跑太久。
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 112.121.80.241
1F:推 chaoms:@@你有看过pdo的原始码吗?上半段解释有误喔... 05/26 16:43