推 chaoms:@@你有看過pdo的原始碼嗎?上半段解釋有誤喔... 05/26 16:43
※ 引述《DarkKiller (System hacked)》之銘言:
: 另外一個是效能的問題...
在 MySQL 裡,SQL Parser 其實不太快,以 BBS 為例子,想要列出像是
http://www.ptt.cc/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