看板 PHP 關於我們 聯絡資訊
※ 引述《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
chaoms:@@你有看過pdo的原始碼嗎?上半段解釋有誤喔... 05/26 16:43