台灣最大程式設計社群網站
線上人數
1668
 
會員總數:240858
討論主題:186640
歡迎您免費加入會員
討論區列表 >> MySQL >> 隱藏Table Record,查詢效率不佳
[ 變換順序 ]  
[我要回覆]
1
回應主題 加入我的關注話題 檢舉此篇討論 將提問者加入個人黑名單
隱藏Table Record,查詢效率不佳
價值 : 95 QP  點閱數:224 回應數:7

樓主

bon
門外漢
0 19
480 39
發送站內信

各位先進好

我有兩個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
別忘捐VP感謝幫助你的人 新手會員瞧一瞧
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
捐贈 VP 給 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
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
[ 變換順序 ]   
1

回覆
如要回應,請先登入.