Re: [討論] 可自訂排序的相簿之資料庫設計

看板Web_Design作者 (銀色)時間13年前 (2011/02/09 21:41), 編輯推噓0(002)
留言2則, 2人參與, 最新討論串4/8 (看更多)
※ 引述《tomin (藍藍紫黃橘 粉灰白綠咖)》之銘言: : connection重要在於connection數是有限的(看RAM, CPU有多大) : 被拿光了後面晚到的是要排隊拿的(等前面的free掉) : 當然你說連線建立,做點事,馬上就free,秒殺。…我想規模大的系統是有差的。 : 此外,連線建立、關閉既費時也耗資源;這點可用連線池改善,避免多次開關。 : (php可用persistent connection) persistent connection 也太暴力了… orz 這種小弟都習慣從設計模式上處理,Factory 也好 Singleton 也好, 只要確保一隻 php 只會開啟一個 db connection, 盡量縮短佔用時間(從 SQL 數量和資料異動量著手), 然後看能不能把 ORM 一起做掉(咦) connection 數量有限沒錯,拿完了後面的 http 就要開始領號碼牌等叫號了, (也就是一般 client 端網站跑跑跑就是開不起來的其中一種情形) 所以網站在達到一個規模之後都會變成多主機的架構(像 Master-Slave* ) 可是一旦拓展成架構,SQL 指令數量異動資料數量這兩樣的影響力就會 被狠狠放大(因為不同主機之間資料同步的關係) 有時在 Master 下了一道看似非常簡單的指令, 可是 sync 過去的時候竟然在 Slave 上硬生生給卡住, 只因為異動的是一個被關聯的資料表,充滿了 index table 需要一併更新, 導致其他 JOIN SELECT 的 SQL 全數凍結… : sql數會影響,但影響比較大的應該是該sql指令所涉及的資料筆數, : 例如 WHERE `order`>1 : 這語法要掃過整個table(可能很大,萬筆以上) 再篩選出符合的筆數  : 相較之下 WHERE `order`=2  的效率就會高很多 WHERE 下的好不好,常常是 SQL 入門的第一個門檻 (換角度度來講,很多人會覺得有加 index 有保庇啊 XDD ) : : 畢竟連線只要不刻意 free 掉,同一隻 php 是可以從頭用到尾的, : 用同一個連線比較省:P : 省還要更省 讀取db次數最好介於0~1次  : 寫入db應該也盡量不超過1次 (善用外鍵FK 可一次寫入多個table) 利用 FK 一次寫入多個 table,有沒有例子可以介紹一下呢? o_oa" : : 另外在寫 code 時,小弟一般都是不信任前端, : : 不僅僅是為了 injection,同時也是避免暴露過多的 URL 變數操作, : : 所以鮮少會用到像前端指定移動位置這種… : 這確實該考量 不過用session就可以知道使用者是誰 及限制他能做的動作 : 我是覺得多用前端 後端可以少一次query 不無小補XD : : 您可以提看看什麼情況下 connection 會不易控制,說不定是我沒搞清楚… : : 但一般來說有幾種常見的設計模式都有利於處理 connection : : 這已經完全可以另開一篇來討論了 XDD : 如我開頭所說 多次(連線)單筆(sql指令) 與單次多筆 的差別 : : 這邊您點到了另一個重點,也就是一開始所提到的「門檻」, : : 以小弟的經驗,在覆載較大的系統上,往往最需要避免的都是 SQL 的數量, : : 一道 SQL 命令永遠比兩道好,兩道 SQL 能處理的永遠比 10 道好, : 同上 原則上如此 但還是要看該sql影響的範圍、複不複雜 : : 再來則是從結構上考慮,怎麼樣的結構可以以最少的異動量,達到相同的目的, : 沒錯! : 我想到一個方法 只是個概念 還不確定可不可行: : 除了原order外 多一個change : order都固定存初始的位置 change則是存改變的值,如+1, -1, +99 : 新增一個view 計算、儲存新的order : 原table: view: : id order change id neworder : ------------------ ------------ : a 1 f 1 : b 2 +5 (底) a 2 : c 3 b 3 : d 4 e 4 : e 5 -1 (上移) d 5 : f 6 -5 (頂) b 6 : 都只query view,更新都只更新原table的change欄位一次(一個sql指令), : 例如往上移一格: : update files set change = change -1 where id = 'e' limit 1; : 置底: : update files set change = change +5 where id = 'b' limit 1; 這個當初有想過,可是實際上用筆移動幾次後, 發現已經快 SELECT 不出來順序了 XD -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 61.31.89.70

02/10 08:50, , 1F
這個一隻php的定義頗模糊 是指request嗎
02/10 08:50, 1F

02/10 18:06, , 2F
一隻 request 沒錯,感謝指正 XDD
02/10 18:06, 2F
文章代碼(AID): #1DKfcBbd (Web_Design)
討論串 (同標題文章)
文章代碼(AID): #1DKfcBbd (Web_Design)