1.善于使用expain
explain的使用清晰度展示了一些需要添加索引以及其它的一些性能信息,可以根據查看explain的結果對語句進行優化
2.切分查詢
感覺計算機里面分而治之的思想無處不在,這里切分查詢既是這個思想的一次展示,如果我們想刪除一年的數據,如果一次性刪除的話對數據庫,會占用大量資源,可能造成阻塞,對正常的服務器運行產生波動影響,
策略:將一次性刪除改為每次刪除1-3萬行數據(這里可根據自己的服務器性能進行變動,使用工具找到影響最小的),在每次刪除后最好暫停一下,這樣能將整個數據操作分散到更長的時間線中,對服務影響更小
3.特定類型優化查詢
(1).count()簡單優化
常見誤解:count函數在MyISAM中非常快
答:只有在沒有where條件的情況下才能非常快
select count(*) from world.city where id > 5;
通過explain可以看出這個sql語句在我的數據庫中掃描了5000行左右代碼,那么如何進行優化,可以倒過來查詢啊
select (select count(*) from world.city) - count(*) from world.city where id < 5
這樣從小的開始排查大大減少了查詢行數,是個不錯的查詢方式。
(2) group by優化
最好優化策略:
◆ GROUP BY 條件字段必須在同一個索引中最前面的連續位置;
◆在使用GROUP BY 的同時,只能使用 MAX 和 MIN 這兩個聚合函數;
◆如果引用到了該索引中 GROUP BY 條件之外的字段條件的時候,必須以常量形式存在
(3) limit優化
limit 在數據量不大的情況下非常適合分頁,再加上索引,相當方便,
但是在數據量便宜很大的情況下就不是很合適了,這里我們引入mysql的一種查詢方法。
延遲查詢:通過使用覆蓋索引查詢返回需要的主鍵,再根據主鍵關聯原表獲得需要的數據。
再說白點就是先查主鍵,在關聯到數據,來看例子:
select film_id, description from sakila.film order by title limit 50000, 5;
查詢五萬條之后的五條數據
優化:
select film.film_id, film.discription from sakila.film inner join (
select film_id, description from sakila.film order by title limit 50000, 5
) as lim using(film_id);
這里我們通過子查詢先查詢了符合條件的id,然后在關聯到表中,查詢效率提升好幾倍
-------------------------------------暫時到這里,后續對文章進行繼續補充