sql優化 自己總結的

2021-10-01 08:47:11 字數 1512 閱讀 5401

1.sql優化

sql優化首先需要找到需要優化的sql,也就是執行比較慢的sql語句,我們在專案中主要用mysql資料庫較多,以mysql資料庫為例,可以採用開啟mysql慢日誌,通過set global slow_query_log=1語句開啟慢查詢日誌,通過show variables like 『%slow_query_log%』 檢視慢查詢日誌開啟狀態和儲存位置,通過設定set global long_query_time=1;的時間,來界定執行時間超過多久的sql為慢查詢sql,通過show variables like 『long%』;檢視設定的時間。設定log-queries-not-using-indexes可以把未使用索引的sql語句也輸出到慢查詢中。也可以使用第三方資料庫連線池比如德魯伊(druid),設定logslowsql屬性為true,通過slowsqlmillis設定慢sql的界定時間。查詢到執行較慢的sql語句之後,根據具體問題對sql語句進行分析,導致sql語句執行較慢的因素主要有

1.過多的表聯查

在拿到執行較慢的sql語句之後,分析其有無冗餘的表聯查,若存在,則去掉,使用巢狀查詢解決多表直接聯查問題,可以把多個表的查詢結果分開執行,然後再把結果合併到一塊。若無法解決表聯查問題,可以把錶的聯查結果寫入mongodb這樣的nosql資料庫中,查詢時直接走nosql資料庫獲取表聯查結果,這種適用於查詢較多,寫入請求較少的情況。

2.資料量較大的表查詢未使用索引,或使用了索引,但是索引未生效。

首先使用sql的執行計畫檢視當前sql語句有無使用索引,使用索引查詢的執行型別是什麼,使用explain關鍵字對sql語句進行分析,返回結果中的type欄位表示索引的使用情況,all代表全表掃瞄,也就是未使用索引,const表示主鍵索引或唯一索引,查詢效率最高,ref引用查詢,查詢非唯一索引匹配項,range索引範圍查詢。key代表當前查詢所使用的實際索引。根據sql執行計畫分析索引的使用情況,對於有條件的表(資料量超過10萬條以上,查詢較頻繁)新增索引,對於查詢新增了索引,應注意一下幾點,a.新增索引的字段必須為where或group by中使用的字段,否則sql語句不會執行索引,多個字段同時查詢可以考慮組合索引。b.新增索引的字段不能進行運算操作,因為索引的使用是在sql編譯器編譯時選擇的,若對索引字段進行運算,其值只有在sql語句執行時才能確定,所以會導致索引失效。c使用like模糊查詢時前後都有%或前面有%時則索引失效,使用組合索引時第乙個字段匹配則走索引,第乙個欄位不匹配則索引失效,各個欄位都匹配索引效率最高。字段順序盡量與索引順序保持一致d.使用in或not in 也會使索引失效,若非必須使用,可以考慮使用其它方式替代,例如between或exists。e 加索引的字段可以為空值。f 乙個表的索引盡量不要超過6個,否則會降低寫入表的效能。

3.一次查詢返回的資料量較大

考慮需求的合理性,採用分頁減少資料量的返回

4.不同資料庫之間sql語句解析器解析方式不同

mysql查詢採用自上而下查詢,過濾掉最大資料量的條件必須緊跟where子句之後,縮小查詢的範圍,例如查詢北京市有多少男性使用者,則要先查詢位址為北京,再查詢性別。oralce採用自下而上的查詢方式,過濾最大資料量的條件必須放在where子句的末尾。

SQL優化總結

1.首先在建表的時候,選用最合適的字段型別。例如在定義name欄位時,可以使用varchar 32 不要使用char 32 以減少不必要的空間 而在定義郵編 郵編固定6位 時也沒必要使用varchar 6 了,直接使用char 6 會更好 對於性別,省份等可以定義為enum型別,因為數值型的資料檢索...

SQL優化總結

1,子查詢優化後問題 有些欄位的區分度飄忽飄忽不定,比如status欄位。我們這個欄位在專案中使用了索引。老版本優化時把主鍵id查出來放到子查詢中,再用status進行篩選,這樣有效果。公升級了mysql之後,出現慢查詢。這個時候子查詢不再適用,應使用ignore index status idx ...

關於SQL優化的總結

最近面試中問到了資料庫sql優化的問題,答得不是很好,故總結一下。主要針對資料庫索引來展開。用索引提高效率 索引是表的乙個概念部分,用來提高檢索資料的效率,oracle使用了乙個複雜的自平衡b tree結構.通常,通過索引查詢資料比全表掃瞄要快.當oracle找出執行查詢和update語句的最佳路徑...