Re: [請益] 看似簡單 但不知怎麼寫較有效率?

看板PHP作者 (NeverEver)時間15年前 (2010/05/26 23:00), 編輯推噓3(301)
留言4則, 3人參與, 最新討論串3/3 (看更多)
建議從 database sql 指令來處理, 三千萬筆資料要 pass 給 PHP 應該會負擔很重. 處理步驟 * 設定 index table1 設 index (start_1, end_1) table2 設 index (start_2, end_2) * 下 SQL 語法: SELECT * FROM table2 WHERE NOT EXISTS ( SELECT * FROM table1 WHERE start_2 <= start_1 AND end_1 <= end_2 ) ※ 引述《eco100 (Maktub)》之銘言: : 我的問題是這樣的 : 我有兩個table如下 : table1: table2: : no. start_1 end_1 name start_2 end_2 : 1 3 5 A 1 6 : 2 4 6 B 7 10 : 3 11 13 C 11 15 : 4 12 14 : 規則是 table1 的start跟end 會落在table2的其中一個start跟end之間 : 我要找出 table2中 完全沒有table1資料落進去的name : 呃 有點繞口 : 我以這兩個table為例 table1中的no.1 start跟end分別為(3, 5) : (3, 5)會落在 table2中的 A (1, 6)裡面 所以A就不是我要找的啦~ : 同理可得到 table1的data會落入到table2中的A跟C : 所以只有"B"是我要的結果 : 依我目前初學者的作法 我是先找出A跟C : 然後再用全部扣掉A、C 得到B這個答案 : 而我目前實際的問題是 : table1約有「3000萬」筆的資料 table2約有25000筆資料 : 在table2 大約會有 1000筆是不會包含table1中的任何資料的 : 若按照我的邏輯去寫 一定會跑很久 : 所以我想問 是否有比較直接的寫法 可以找出那大約1000筆的資料? : 或者是有比較快速的寫法? 可以用哪些語法? : 還請各位指點 感謝大家 ^^ -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 115.64.54.125

05/26 23:23, , 1F
同感,請務必在SQL處理好~~若是MSSQL的話可考慮用BETWEEN
05/26 23:23, 1F

05/27 09:25, , 2F
index建R-tree 會更快 一般都是用b-tree
05/27 09:25, 2F

05/27 17:36, , 3F
start_2 <= start_1 AND end_1 <= end_2 這個沒辦法靠
05/27 17:36, 3F

05/27 17:36, , 4F
cache,所以校益其實沒想像中大喔,很可能還是 35M * 30k
05/27 17:36, 4F
文章代碼(AID): #1B_JTrHf (PHP)
文章代碼(AID): #1B_JTrHf (PHP)