1、使用limit 當不需要取出全部數據時,在查詢後面加上limit限制。 2、select * 每次看到select * 的時候都需要用懷疑的眼光審視,是不是真的需要返回全部的列。 3、重覆查詢相同的數據 有時可能會重覆執行相同的查詢,比如在用戶評論的地方需要查詢用戶頭像url,如果用戶多次評論, ...
1、使用limit
當不需要取出全部數據時,在查詢後面加上limit限制。
2、select *
每次看到select * 的時候都需要用懷疑的眼光審視,是不是真的需要返回全部的列。
3、重覆查詢相同的數據
有時可能會重覆執行相同的查詢,比如在用戶評論的地方需要查詢用戶頭像url,如果用戶多次評論,可能就會反覆查詢這個數據。比較好的方案是,當初次查詢的時候將這個數據緩存起來,需要的時候從緩存中取出,這樣性能顯然會更好。
4、列表IN()的比較
相對於OR,IN()的處理速度更快。
5、分解關聯查詢
對於一些複雜的關聯查詢可以拆分為多個簡單查詢。這樣可以讓緩存的效率更高;執行單個查詢可以減少鎖的競爭;減少冗餘記錄的查詢;查詢本身效率也可能會有所提升。
6、關聯子查詢
慎用關聯子查詢,特別是where條件中包含IN()的子查詢。
7、優化UNION查詢
除非必要,否則使用union all。如果沒有all關鍵字,MySQL會給臨時表加上distinct選項,這會導致對整個臨時表的數據做唯一性檢查。
如果使用union的同時要使用limit,則在union的各個子句中分別使用limit速度更快些。
(select id, name from A order by id) union all (select id, name from B order by id) order by id limit 20;
上面這個語句是先查詢所有滿足條件的數據,存放臨時表中,再從臨時表中取出20條數據。
這個語句可以優化成:
(select id, name from A order by id limit 20) union all (select id, name from B order by id limit 20) order by id limit 20;
優化後的語句是分別查詢20條數據存放臨時表中,總共40條數據,再從臨時表中取出20條數據。
8、MIN()和MAX()優化
對於min()和max()查詢,MySQL的優化做的並不好。使用時往往會造成全表掃描。如:
select max(id) from A where name = 'XXX';
可以使用limit來優化查詢:
select id from A where name = 'XXX' order by id DESC limit 1;
9、使用索引查詢
這個可以參考我的另一篇博客:https://www.cnblogs.com/woods1815/p/9973507.html