Re: [討論] 可自訂排序的相簿之資料庫設計
※ 引述《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
02/10 08:50, 1F
→
02/10 18:06, , 2F
02/10 18:06, 2F
討論串 (同標題文章)
以下文章回應了本文:
完整討論串 (本文為第 4 之 8 篇):