看板 Database 關於我們 聯絡資訊
※ 引述《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)
KC73:這有點像是一個有 cache, 一個沒 cache 的結果? 07/05 22:43
TonyQ:chris你還真認真測試=.=a 連測資都自己弄... 07/06 00:31
TonyQ:不曉得小數點底下三位的數字準不準.. 07/06 01:05
chrisQQ:確定不是 cache 因為同樣兩個指令我作三次以上… 07/09 19:33