Query 語句對系統性能的影響案例分析

一個合理的數據存取實現和一個拙劣的實現相比,在性能方面的差異經常會超出一個甚至幾個數量級。SQL 語句執行所消耗的最大兩部分資源就是IO和CPU。


案例一、

在我們的示例網站系統中,現在要實現每個用戶查看各自相冊列表(假設每個列表顯示10 張相片)的時候,能夠在相片名稱後面顯示該相片的留言數量。

1、通過“SELECT id,subject,url FROM photo WHERE user_id = ? limit 10” 得到第一頁的相片相關信息;
2、通過第1 步結果集中的10個相片id 循環運行十次“SELECT COUNT(*) FROM photo_comment WHERE photh_id = ?” 來得到每張相冊的回覆數量然後再瓶裝展現對象。

或者

1、和上面完全一樣的操作步驟;
2、通過程序拼裝上面得到的10 個photo 的id,再通過in 查詢“SELECT photo_id,count(*) FROM photo_comment WHERE photo_id in (?) GROUP BY photo_id” 一次得到10 個photo 的所有回覆數量,再組裝兩個結果集得到展現對象。


從MySQL 執行的SQL 數量來看,第一種解決方案爲11條SQL 語句,第二種解決方案爲2 條SQL 語句(1+1);
從應用程序與數據庫交互來看,第一種爲11 次,第二種爲2 次;
從數據庫的IO 操作來看,簡單假設每次SQL 爲1 個IO,第一種最少11 次IO,第二種小於等於11次IO,而且只有當數據非常之離散的情況下才會需要11 次;


==========================可愛的分隔符=======================

案例二、

在羣組簡介頁面需要顯示羣名稱和簡介,每個羣成員的nick_name,以及羣主的個人簽名信息。
需求中所需信息存放在以下四個表中:user,user_profile,groups,user_group


一條SQL 語句搞定所有事情:
SELECT name,description,user_type,nick_name,sign
FROM groups,user_group,user ,user_profile
WHERE groups.id = ?
AND groups.id = user_group.group_id
AND user_group.user_id = user.id
AND user_profile.user_id = user.id    -----對非羣主的profile信息進行的訪問,造成了資源的浪費


或者分兩步搞定:
首先取得所有需要展示的group 的相關信息和所有羣組員的nick_name 信息和組員類別:
SELECT name,description,user_type,nick_name
FROM groups,user_group,user
WHERE groups.id = ?
AND groups.id = user_group.group_id
AND user_group.user_id = user.id
然後在程序中通過上面結果集中的user_type 找到羣主的user_id 再到user_profile 表中取得羣主的簽名信息:
SELECT sign FROM user_profile WHERE user_id = ?


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章