SQL語句及資料庫優化

2021-07-11 22:46:59 字數 1969 閱讀 9871

1,統一sql語句的寫法

對於以下兩句sql語句,程式設計師認為是相同的,資料庫查詢優化器認為是不同的。 所以封裝成復用方法,用標準模板來控制。

select*from dual 

select*from dual

其實就是大小寫不同,查詢分析器就認為是兩句不同的sql語句,必須進行兩次解析。生成2個執行計畫

2,不要把sql語句寫得太複雜

我經常看到,從資料庫中捕捉到的一條sql語句列印出來有2張a4紙這麼長。一般來說這麼複雜的語句通常都是有問題的。我拿著這2頁長的sql語句去請教原作者,結果他說時間太長,他一時也看不懂了。可想而知,連原作者都有可能看糊塗的sql語句,資料庫也一樣會看糊塗。

比如 select語句的結果作為子集

簡化sql語句的重要方法就是採用臨時表暫存中間結果,但是,臨時表的好處遠遠不止這些,將臨時結果暫存在臨時表,後面的查詢就在tempdb中了,這可以避免程式中多次掃瞄主表 也大大減少了程式執行中「共享鎖」阻塞「更新鎖」,減少了阻塞,提高了併發效能。

3,必須採用繫結變數

select*from orderheader where changetime >『2010-10-20 00:00:01『 

select*from orderheader where changetime >『2010-09-22 00:00:01『

以上兩句語句,查詢優化器認為是不同的sql語句,需要解析兩次。如果採用繫結變數

select*from orderheader where changetime >@chgtime

4,使用like進行模糊查詢時應注意

有的時候會需要進行一些模糊查詢比如

select*from contact where username like 『%yue%』

5,聯表查詢

(1)    連線字段盡量選擇聚集索引所在的字段

(2)    仔細考慮where條件,盡量減小a、b表的結果集

springmvc+mybatis+spring 整合 bootstrap html5

6,索引,

看sql 的效能,主要看執行計畫,還有cpu成本,io成本等。這裡就以乙個簡單的表為例。

首先,建立乙個簡單的表,一般會先建個主鍵,系統自動以主鍵建聚集索引。

判斷是否需要優化sql的乙個簡單規則是:看執行計畫中的操作是seek(搜尋)還是scan(掃瞄)

是scan的話就要索引。

使用場景:

當乙個系統查詢比較頻繁,而新建,修改等操作比較少時,可以建立覆蓋索引,將查詢欄位和where子句裡的字段全部包含在內,這樣查詢的速度會比以前快很多,同時也帶來弊端,就是新建或修改等操作時,比沒有索引或沒有建立覆蓋索引時的要慢。讀寫資料庫分離也能解決問題

經常對creator_id欄位查詢,就做個索引。

對錶article的creator_id欄位建索引

create index ix_article_creatorid on article(creator_id)

set statistics io 和 set statistics,這是效能調優時檢視相關cpu占用時間,io資源資料的兩個比較重要的命令

記得order by 語句加索引

7,讀寫分離

當主資料庫進行寫操作時,資料要同步到從的資料庫,這樣才能有效保證資料庫完整性

主從分離,對資料庫層面就是資料同步或者是資料複製;從應用層講就是請求的分離:增刪改請求主庫,查詢請求從庫

8,盡量不用select * from …..

,而要寫欄位名 select field1,field2,…這條沒什麼好說的,主要是按需查詢,不要返回不必要的列和行。

9 任何對列的操作都將導致表掃瞄,

它包括資料庫函式、計算表示式等,查詢時要盡可能將操作移至等號右邊

10 in 、or子句常會使索引失效

顯而易見的,in,or擴大的查詢範圍。

11通常情況下,連線比子查詢效率要高

必然的,需要子查詢時,也是用臨時表暫存中間結果

資料庫優化 sql語句優化

1 group by語句優化 因為mysql對所有group by的字段進行排序,所以如果包含group by但是想要避免排序結果的消耗,可以指定order by null來進行group by的排序。select id,sun moneys from sales group by id expla...

資料庫 sql語句優化

寫操作 write 1 如果你同時從同一客戶插入很多行,使用多個值表的insert語句。這比使用分開insert語句快 在一些情況中幾倍 insert into test values 1,2 1,3 1,4 2 如果你從不同客戶插入很多行,能通過使用insert delayed語句得到更高的速度。...

mysql資料庫sql語句優化

昨天幫同事優化了乙個sql語句發出來共勉下 select t.select s.codename from sys codelist s where s.codevalue t.packagingtype and s.kindcode packaging as packagingtypename,s...