![]() ![]() ![]() ![]() |
|||||
|
|||||
樓主 bon ![]()
![]() |
我有兩個table,一個是客戶的基本資料,另一個是訪談紀錄。兩者用客戶id關聯。 當使用者在前端刪除客戶時,為了之後能夠再復原,實際上是將該客戶在兩個table的record隱藏起來,用一個tinyint(1) "visible"。 所以查詢時都一定要找visible=1的紀錄,但是加上這個條件卻會使查詢時間多十幾秒。 例如,客戶基本資料table為contact,訪談紀錄為note,pk為cid,要找出曾經聊到培根的客戶: SELECT name FROM contact c, note n WHERE c.cid=n.cid AND n.content LIKE '%培根%' AND c.visible=1 AND n.visible=1 請問是否我這樣的SQL語句有問題,有更合適的方式來撰寫? 目前我考慮的方向是另外複製兩個table,專門放被刪掉的資料。
搜尋相關Tags的文章:
[ 查詢效率 ] ,
本篇文章發表於2017-07-31 13:06 |
1樓 |
看到 c.cid=n.cid ,覺得問題應該是出在這
這種關聯的資料應該用子查詢會比較好 參考:子查詢教學 程式碼: (這邊假設 contact 跟 note 的 visible 是同步更新的,所以只確認其中一邊即可)
本篇文章回覆於2017-07-31 17:30
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔-- |
2樓 |
我再研究看看,剛剛我說的好像也有點怪怪的
本篇文章回覆於2017-07-31 18:12
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔-- |
3樓
最有價值解答
小魚 ![]() |
我們一般習慣用JOIN的方式,
十幾秒有點誇張, 你的資料量到底多少... 你比較看看哪種方式比較快
本篇文章回覆於2017-07-31 20:01
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔-- |
4樓
不錯的參考
topcat ![]() ![]() |
1.試著去觀察執行計畫
2.試著加上適當的index ^_^
本篇文章回覆於2017-07-31 22:49
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔-- |
5樓
不錯的參考
小魚 ![]() |
另外,
可以用explain跟show profile去觀察問題出在哪裡。
本篇文章回覆於2017-07-31 23:36
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔-- |
6樓
作者回應
bon ![]() |
感謝各位的幫忙!
改用Inner Join,把visible設為索引後,查詢時間縮短到1秒多,真驚人! 透過explain來看,type從原本all,加入索引變成ref。
本篇文章回覆於2017-08-01 11:50
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔-- |
7樓 |
我突然想到一種方法,就是既然cid本身是鍵值,如果是整數型態,且cid>=1的話
可以把cid取負當作隱藏 這時只要用條件 cid>0 即可,不用再多一個欄位。
本篇文章回覆於2017-08-01 14:12
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔-- |
回覆 |
如要回應,請先登入. |