台灣最大程式設計社群網站
線上人數
1079
 
會員總數:243471
討論主題:188184
歡迎您免費加入會員
討論區列表 >> MySQL >> 查詢最近新增的資料,從表格最底部開始查詢
[]  
[我要回覆]
1
回應主題 加入我的關注話題 檢舉此篇討論 將提問者加入個人黑名單
查詢最近新增的資料,從表格最底部開始查詢
價值 : 93 QP  點閱數:1309 回應數:4

樓主

bon
門外漢
0 20
524 41
發送站內信

各位先進好

我想要在一個表格內查詢最新的一筆某類型資料,最近新增的資料會在表格的最底部,並以TimeStamp欄位紀錄資料新增的日期。
目前我使用的SQL為SELECT id FROM table WHERE type=3 AND time_stamp>'2018-5-1' LIMIT 1
請問是否有什麼方法可以在type=3的資料之中,一旦查詢time_stamp小於'2018-5-1'時就結束查詢?
理想的話應該比對幾筆資料就能找到目標,或確定目標不存在。

搜尋相關Tags的文章: [ time stamp ] ,
本篇文章發表於2018-05-08 17:37
別忘捐VP感謝幫助你的人 新手會員瞧一瞧
1樓
作者回應

bon
檢舉此回應
沒注意到也有人問相同的問題https://www.blueshop.com.tw/board/FUM20041006152746MYF/BRD20180118113418DLR.html

因為PK-id是流水號,所以我嘗試用C#先以「SELECT id, type, time_stamp FROM table ORDER BY id DESC LIMIT 50」把表格中的最後50筆資料讀取出來,再用迴圈去比對time_stamp當小於'2018-5-1'時就結束。
如果「SELECT id FROM table WHERE type=3 AND time_stamp>'2018-5-1' LIMIT 1」結果是0筆資料時,大概要花3~5秒的時間,用新的方法SQL+C#的處理時間只有不到0.01秒,感覺還不錯。
結論是在SQL內做日期的比對會比做數字的比對要花更多時間,而且如果時間大於'2018-5-1'的資料不存在時,就要將整個表格全部比對一次。而SQL搭配C#可以做到我心目中的比對模式,缺點是LIMIT 50有可能找出來的日期全部都大於'2018-5-1',真正的目標type 3可能在我找出來的這50筆資料以外。
本篇文章回覆於2018-05-09 09:27
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
2樓
最有價值解答

迷路
捐贈 VP 給 迷路 檢舉此回應
第一,你可以先加索引,這是資料庫中非常重要的東西,能大幅縮減龐大/複雜搜尋所需的時間
第二,你可以將日期欄位轉成數字(秒數),就像你說的找數字比日期來的快
第三,你可以試試你找到的那篇文章的方法,用一個SQL式先找五十筆再作日期檢查,我相信會比你在C#中處理來的快
本篇文章回覆於2018-05-09 09:38
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
3樓
作者回應

bon
檢舉此回應
感謝迷路大大

按照您說的做的確比較方便,之前我以為索引只能用在重複性高的數值所以沒將date加入索引,最早沒使用C#時的SQL語句要花費20~30秒才能完成,把日期轉為數字並設為DESC的索引後,相同的SQL語句只要0.04秒,太神奇了珍妮佛。
本篇文章回覆於2018-05-09 10:39
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
4樓
回應

浩瀚星空
捐贈 VP 給 浩瀚星空 檢舉此回應
那個~~~~
這邊我擔心一個誤會的問題。還是先說明一下會比較好。

1.數值欄位會比字串欄位查尋速度快,這是沒問題的。因為數值式的範圍限定比較直覺。
在mysql的運做上也會單純許多。where數值式。比較不會發生全表處理的情況。

2.對date加索引其實是沒必要的。你原本的論點是對的。幾乎沒什麼重覆性資料的。加索引是真的沒意義。
會不會變快??還是有的。只是效能上差異不大。索引有必要才建。畢竟索引多就會影響到新增跟更新的速度。
只找最有效率的欄位建索引會比較好。一般來說,除了唯一性的值,大多數會很常用到where做條件的欄位
大多都是需要建索引是沒錯。

最後,你會感覺比較快。你得先確定一件事。mysql本身會對同一個sql語法已執行取完資料的做緩存。
也就是說,同一段sql語法,第二次運行一定都會比第一次快很多。(畢竟已經不需要跑了)

所以我擔心你是因為這樣的因素造成誤會以為變很快。
本篇文章回覆於2018-05-11 13:31
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
   
1

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