在一次上線以後,發現一個列表查詢出來的數據只有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 by和limit連用實際上是有不少注意點,包括會致使分頁查詢,不一樣頁查詢到同一個數據的狀況。io
固然都是能夠經過一些方法解決,好比在limit前,count下總數據;指定主鍵id範圍進行查詢等,可是用的時候須要本身注意。form
最後記錄下,mysql客戶端直接查詢慢sql的方法:
SELECT * from information_schema.`PROCESSLIST` where COMMAND<>'Sleep';