看板 Database 關於我們 聯絡資訊
我剛剛從6秒多 降到 0.07秒 原來設定索引不要個別設定 設定成 多欄位的那種索引會比較快 快了大概一半 然後再多設定一點條件 降低她整張表的搜尋 效果一樣 從 6秒降到0.07 SQL SELECT p.ishtar_id, p.name, count( a2.aid ) AS count FROM ishtar_profiles AS p INNER JOIN ( `answer` AS a1 INNER JOIN `answer` AS a2 ON a1.ishtar_id != a2.ishtar_id AND a1.qid = a2.qid AND a1.answer = a2.answer ) ON p.ishtar_id = a2.ishtar_id WHERE p.status = '開放中' AND p.pic = 'Y' AND p.sex =1 AND ( ( p.age >= ( SELECT avg( p2.age ) -5 AS age FROM friend AS f2 INNER JOIN ishtar_profiles AS p2 ON f2.friend_id = p2.ishtar_id AND p2.age !=0 WHERE f2.ishtar_id =00000001 ) AND p.age <= ( SELECT avg( p2.age ) +5 AS age FROM friend AS f2 INNER JOIN ishtar_profiles AS p2 ON f2.friend_id = p2.ishtar_id AND p2.age !=0 WHERE f2.ishtar_id =00000001 ) ) OR p.age =0 ) AND a1.ishtar_id IN ( SELECT friend_id AS ishtar_id FROM friend WHERE ishtar_id =00000001 ) AND a2.ishtar_id NOT IN ( SELECT friend_id AS ishtar_id FROM friend WHERE ishtar_id =00000001 ) GROUP BY p.ishtar_id ORDER BY `count` DESC , p.update DESC LIMIT 10 ※ 引述《starjou (周星星)》之銘言: : 沒有辦法 index 的資料要當 order by key,效能大受影響是可想而知的了。 : 其實我想推文的,可是還要等很多很多秒。 : 現在想到的方法是把 group 出來的資料 insert 到某個設好 index 的 : temporary table,然後再排序,不過這樣省了 order by 非索引欄位的時間, : 又多了 insert 的 I/O 時間。 : (或是能用暫存在記憶體的 temporary table,如果 ram 夠的話?) : 如果你有去試的話跟我說一下結果怎麼樣?(看能不能真的試個幾十萬筆的資料) : 看有沒有高手有高招了..... -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 219.84.230.9
starjou:眼花了 XD 08/17 19:47
slalala:建議不要用NOT IN去做比對 資料量越多效率越囧 08/17 21:40
mosquito520:你要不要直接貼個範例資料出來看 跟你要撈什麼資料 08/19 21:19
zusocfc:把NOT的東西全部去掉,改個方式去寫,不然會佔用一堆時間 08/20 16:57