大家好,我使用了以下的SQL語句
SELECT Count(*) FROM [tblHitRecordsDtl] inner join [tblHitRecords] on
[tblHitRecords].id = [tblHitRecordsDtl].hitRecId where
[tblHitRecordsDtl].rank = 1 and (recTime >= 1603419942778 and recTime <=
1604419942778)
其中,recTime是Integer型別。
當where條件後只有rank=1時,速度約500ms以下,但加上recTime的判斷後,
大約要花費3-4秒…
資料表只有5萬筆資料,想請問板上大神該如何解決呢? 謝謝。
uj5u.com熱心網友回復:
首先,以下不考慮你的硬體問題。造成速度慢的是inner join這個操作,而快慢的取決于你要join的兩個表的初始大小。
盡量減小你兩個表的連接數量,吧where的判斷先在連接前進行,可以提高速度。
引數recTime,你沒有注明是哪一個表的,我先默認為表tblHitRecords中的值了。
SELECT
Count(1 )
FROM
( SELECT * FROM [ tblHitRecordsDtl ] WHERE [ tblHitRecordsDtl ].rank = 1 ) AS t1
INNER JOIN ( SELECT * FROM [ tblHitRecords ] WHERE [ tblHitRecords ].recTime >= 1603419942778 AND [ tblHitRecords ].recTime <= 1604419942778 ) AS t2 ON t2.id = t1.hitRecId
WHERE
[ tblHitRecordsDtl ].rank = 1
AND ( recTime >= 1603419942778 AND recTime <= 1604419942778 )
其次 如果你把t1,t2的select * 變更為你需要的少量欄位的話,也可以一定速度加快查詢。
究其原因是,recTime這個范圍檢索,本身就比rank=1這種要慢。
其次 你也可以考慮索引的因素,把需要檢索的欄位加上索引,具體方法你可以查一下,我就不再贅述了。
uj5u.com熱心網友回復:
抱歉 sql中的where忘記洗掉了 更正為:
SELECT
Count( * )
FROM
( SELECT * FROM [ tblHitRecordsDtl ] WHERE [ tblHitRecordsDtl ].rank = 1 ) AS t1
INNER JOIN ( SELECT * FROM [ tblHitRecords ] WHERE [ tblHitRecords ].recTime >= 1603419942778 AND [ tblHitRecords ].recTime <= 1604419942778 ) AS t2 ON t2.id = t1.hitRecId
uj5u.com熱心網友回復:
很高興收到您的回覆,謝謝。我將您語句中第二個[ tblHitRecordsDtl ]改為t1後才能執行。
得到的結果如下圖… 速度依然一樣。
不曉得recTime的型別是Int不是DateTime有沒有影響…
p.s. CPU是i7 8核心,且沒有滿載。
uj5u.com熱心網友回復:
謝謝您的細心指導,嘗試用這句新語法後,花費時間依然沒有變小…
因為速度這麼慢,導致我懷疑是否自己下的語法有誤。
目前的確是還沒有建立索引… 可我想的是-才5萬筆就需要用索引改善了嘛
uj5u.com熱心網友回復:
int和dateTime欄位差的并不多,如果條件允許推薦使用timestamp,這個更優(空間只要dateTime的一半)。可以試試
處理器可以的話,應該不是索引問題
嘗試把*變更為具體項
SELECT
Count( 1 )
FROM
( SELECT hitRecId FROM [ tblHitRecordsDtl ] WHERE [ tblHitRecordsDtl ].rank = 1 ) AS t1
INNER JOIN ( SELECT id FROM [ tblHitRecords ] WHERE [ tblHitRecords ].recTime >= 1603419942778 AND [ tblHitRecords ].recTime <= 1604419942778 ) AS t2 ON t2.id = t1.hitRecId
速度其實也和你一條資料的欄位數量有關
uj5u.com熱心網友回復:
剛才又拿這條去試,發現速度是相似的,居然沒有差異,我的頭快痛死了XD
莫非這已經是極限了嘛... 這兩張表分別大約各5萬筆資料,而且因為是記錄表,一日成長的數量會很可觀。
方才有查到文章有人提到用【日期範圍】速度較【時間戳範圍】快上6倍!!
分享給您看看@@"
https://kknews.cc/zh-tw/code/9zbqpjl.html
uj5u.com熱心網友回復:
補充一下: 實際上我把INNER JOIN拿掉,只針對[ tblHitRecords ]作查詢,發現時間花費也近似…SELECT
Count( 1 )
FROM [tblHitRecords] WHERE [tblHitRecords].recTime >= 1603419942778 AND [tblHitRecords].recTime <= 1604419942778
另外有使用 【EXPLAIN QUERY PLAN】 查看執行計劃,如下圖供參考,也謝謝您的協助。
uj5u.com熱心網友回復:
先試試單表查詢recTime范圍需要多久uj5u.com熱心網友回復:
e大您好,單表查詢recTime範圍有試過了,大約也是3.5s…
覺得花費時間沒有什麼差異。
謝謝!
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/188172.html
標籤:MySQL
