今天我們再來研究一下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
結果還是比較能接受的,當然這個未必是最優解,有同學有更好的想法可以給下思路。其實一般優化思路從兩方面入手,最基本的是語句,再者就是索引。