mysql性能檢測02

今天我們再來研究一下mysql,探討一下平常常用的sql語句是否有值得優化的地方。例如說我想查找表中重複的數據,一般我們會這樣寫,例如我們要查詢sname這個字段重複的,一般我們會利用groupby來先分組,然後用having爲我們篩選分組後的各組數據。

SELECT
 s.id,s,sno,s.sname
FROM
 student s
WHERE s.sname IN
  (SELECT
    t.sname
  FROM
    student t
  GROUP BY t.sname
  HAVING COUNT(t.sname) > 1)

在數據量極少的情況這樣寫是ok的,前提當數據量達到數十萬甚至百萬級別,你會發現groupby效率極其低下,所以一般我們會對分組字段添加索引。那麼我們來加上索引後看看情況如何,我們就使用一般索引

---未加索引
共 20 行受到影響

執行耗時   : 7.062 sec
傳送時間   : 0.003 sec
總耗時      : 7.066 sec
---添加索引後
共 20 行受到影響

執行耗時   : 1.118 sec
傳送時間   : 0.003 sec
總耗時      : 1.122 sec

測試數據是50w條,添加和不添加索引,對比是明顯的,時間接近相差了6-7倍。可想而知,當數據達到百萬級別時的效率了。
那麼我們能不能再優化呢?要不寫個存儲過程,儘管試試。

SELECT a.id,a.sno,a.sname FROM (SELECT
   sname
 FROM
   student 
 GROUP BY sname
 HAVING COUNT(sname) > 1) tmp
 INNER JOIN student a
   ON tmp.`sname` = a.`sname`
---未加索引時
共 20 行受到影響

執行耗時   : 6.456 sec
傳送時間   : 0.003 sec
總耗時      : 6.460 sec
---添加索引後
共 20 行受到影響

執行耗時   : 0.269 sec
傳送時間   : 0.003 sec
總耗時      : 0.273 sec

結果還是比較能接受的,當然這個未必是最優解,有同學有更好的想法可以給下思路。其實一般優化思路從兩方面入手,最基本的是語句,再者就是索引。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章