2018-06-30-查詢性能優化點總結

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,然后在關聯到表中,查詢效率提升好幾倍

-------------------------------------暫時到這里,后續對文章進行繼續補充

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。