Re: [SQL ] select 問題

看板Database作者 (ChrisLiu)時間16年前 (2008/07/05 10:39), 編輯推噓3(301)
留言4則, 3人參與, 最新討論串5/5 (看更多)
※ 引述《TonyQ (骨頭)》之銘言: : 這樣就還蠻順利的,想問問看我原本的寫法 , : 是不是有造成笛卡爾乘績的疑慮,還是有什麼狀況. : 因為in這個keyword不是個很好google的詞 , 所以上來請教~~ --;;; 剛剛做的測試 sid userId fromaddress 1 aaa 10.10.1.2 2 aaa 10.10.1.3 3 aaa 10.10.1.4 4 bbb 10.10.2.2 5 bbb 10.10.2.3 6 bbb 10.10.2.4 7 ccc 10.10.3.2 8 ccc 10.10.3.3 9 ccc 10.10.3.4 10 ddd 10.10.2.2 11 ddd 10.10.4.3 12 ddd 10.10.4.4 13 ccc 10.10.3.5 14 aaa 10.10.4.2 15 ccc 10.10.1.2 顯示記錄 0 - 4 (5 總計, 查詢需時 0.0007 秒) SELECT u1. * FROM `test` u1 WHERE u1.fromaddress IN ( SELECT DISTINCT u2.fromaddress FROM `test` u2 WHERE u2.userid = 'aaa' ) LIMIT 0 , 30 顯示記錄 0 - 3 (4 總計, 查詢需時 0.0001 秒) SELECT DISTINCT u2.fromaddress FROM `test` u2 WHERE u2.userid = 'aaa' LIMIT 0 , 30 顯示記錄 0 - 4 (5 總計, 查詢需時 0.0003 秒) SELECT u1. * FROM `test` u1 WHERE u1.fromaddress IN ( '10.10.1.2', '10.10.1.3', '10.10.1.4', '10.10.4.2' ) LIMIT 0 , 30 1 aaa 10.10.1.2 2 aaa 10.10.1.3 3 aaa 10.10.1.4 14 aaa 10.10.4.2 15 ccc 10.10.1.2 很顯然的印證了 O'Reilly 的 《PHP與MySQL應用實務》 ISBN:986-7794-68-0 當中 ch15 對 IN 子句所作的描述 「若在 MySQL 中執行此查詢,會發現執行速度很慢,因為 MySQL 仍不善於 巢狀查詢的最佳化。」(此查詢指書上的範例) 我想可能是這樣吧… 不過兩個方法得到的東西是一樣的就是了… 後記: 執行 SELECT u1.* FROM `test` u1 where u1.fromaddress in( select distinct u2.fromaddress from `test` u2 where u2.userid='aaa' ) 顯示記錄 0 - 4 (5 總計, 查詢需時 0.0001 秒) 跟 SELECT u1. * FROM `test` u1 WHERE u1.fromaddress IN ( SELECT DISTINCT u2.fromaddress FROM `test` u2 WHERE u2.userid = 'aaa' ) 顯示記錄 0 - 4 (5 總計, 查詢需時 0.0007 秒) 的時間竟然有差… 一個只是有排版,一個沒排版… 不過 phase 的時間應該不會影響結果吧… 我猜是資料量太多所以用 IN 子句效率就會減低。 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 118.161.232.122 ※ 編輯: chrisQQ 來自: 118.161.232.122 (07/05 10:50)

07/05 22:43, , 1F
這有點像是一個有 cache, 一個沒 cache 的結果?
07/05 22:43, 1F

07/06 00:31, , 2F
chris你還真認真測試=.=a 連測資都自己弄...
07/06 00:31, 2F

07/06 01:05, , 3F
不曉得小數點底下三位的數字準不準..
07/06 01:05, 3F

07/09 19:33, , 4F
確定不是 cache 因為同樣兩個指令我作三次以上…
07/09 19:33, 4F
文章代碼(AID): #18RjxUoK (Database)
文章代碼(AID): #18RjxUoK (Database)