本周有個優化sql任務,有一條sql慢查詢,起初看了下感覺並沒有什么問題,但是就是出現了慢查詢,后來細究后發現了問題:
sql:select id, name, mtime, .... from a force index (mtime) where id >= ? and mtime >= ? and mtime <= ? and name = ? and ..... order by id limit ?
現狀:因為是客戶表,表字段比較多,此表共有10個索引,然后此sql語句用了其中2個索引,因為考慮到sql的索引選擇器可能會選擇錯誤,所以使用了force index,強制使用索引,此sql強制了使用修改時間:mtime。
初看時沒問題的,但是后來根據腳本邏輯發現,根據時間篩選出范圍,然后再根據id,每次查200條進行邏輯處理,第一次sql查詢的時候用mtime索引確實沒問題,但是后續每次循環取200條數據,並沒有用到主鍵id索引,這樣就造成了慢查詢。
修改:force index (mtime) 改為 force index (mtime,primary),這樣可以讓sql選擇器自己再進行選擇,是使用mtime更加快還是用id主鍵更快
ps 拓展:1、ignore index 忽略某個索引。 2、force index 強制使用某個索引,如果這個索引沒有用上,則會全表掃描。 3、use index 建議使用某個索引,如果這個索引沒用上,會再尋找其它索引