天天看點

對sql優化的一些方法

好久沒更新部落格了,最近主要工作是對sql的優化把自己的工作心得寫下來;

sql優化是一個漫長和複雜的過程

1.對sql語句的本身的優化,sql分為簡單的查詢和複雜的查詢,盡量保證所有的查詢都能使用到索引(通過執行計劃檢視),盡量在sql少使用子查詢(根據具體的業務能不使用就不使用)。

2.根據具體的業務(如果表的資料量不是非常大),可以采用預先加載的方式,比如我第一次隻有查詢2個字段,下次可能要查詢3個字段這種情況的查詢條件一樣的情況下,可以采用一次把要所有的字段查詢出來然後緩存,當下次查詢的條件相同就不用去資料庫查詢,而直接從緩存中讀取資料,再取出想要的字段,這種情況對并發量的大的效果非常大,能大大減少對資料庫的壓力,減少對資料庫的查詢。當然要具體的業務具體對待緩存的資料不能很大,還有查詢的條件變化不會非常大否則緩存的命中率非常低,緩存的意義就不在了。

3.對複雜sql的優化 如果一些複雜的sql很慢或者group by order by 導緻很慢,可以把複雜的sql語句拆分簡單的sql然後分别查詢,然後在程式裡面去進行拼接,去用map實作group by ,自己排序等操作,當然這種情況對一次查詢的資料量不能很大否則會有jvm溢出錯誤。

4.總之所有的sql優化都是根據具體的業務規則來實作,不同的業務會導緻不同的優化方法和不同的處理方式,是以要優化隻有針對具體的業務來實作;當然跟建表是否合理有關。

5.對于mysql中盡量不要使用子查詢,一般我們的了解子查詢是先執行子查詢然後再關聯外面的表,但是mysql是直接拿外面的表每一行去關聯裡面子查詢的表每一行是以會導緻非常慢;

還有在使用sql的時候要注意where條件比對的時候參數類型一定要一緻否則會使用不到索引,比如 select * from tableName where name=123 而name是varchar在資料庫有索引的情況下是用不到索引的。