order by --- limit 致使查詢速度慢

  • 前言

在一次上線以後,發現一個列表查詢出來的數據只有9條,可是數據出來的時間竟達到了3秒多。疑惑啊!mysql

  • 查找

通過服務的監控以及慢sql的查找,最終定位到是一條查詢sql耗時3秒多。以下:sql

SELECT * FROM account WHERE type = ?  ORDER BY create_date LIMIT 10;
  • 分析

看起來sql很正常啊!接下去用EXPLAIN分析:code

查詢的時候是create_date作索引的,也只掃描到了10行,EXPLAIN顯示一切都很正常。orm

接下去發現其實總數據其實只有9條,可是咱們查詢的時候是limit了10,不知道和這個有沒有關係?blog

無奈之下只能開始查詢各類資料。。。排序

  • 結果

最終發現是和以前的猜想相同。當limit的數據小於查詢總數據量的時候,只要orderby有索引,數據會很快返回,此時使用的是索引排序。可是當limit的數據大於查詢的總數據量的時候,這時候就要花裏胡哨了。此時使用的是文件排序,他會全表從頭開始掃描,直到把整個表都掃描完。最後無論夠不夠limit的數量,都會將結果返回。索引

此時若是where的子查詢中條件如果有索引,也是能夠避免我這種查詢耗時很長的狀況。it

  • 總結

order bylimit連用實際上是有不少注意點,包括會致使分頁查詢,不一樣頁查詢到同一個數據的狀況。io

固然都是能夠經過一些方法解決,好比在limit前,count下總數據;指定主鍵id範圍進行查詢等,可是用的時候須要本身注意。form

最後記錄下,mysql客戶端直接查詢慢sql的方法:

SELECT * from information_schema.`PROCESSLIST` where COMMAND<>'Sleep';
相關文章
相關標籤/搜索