資料庫 sql語句優化

2021-08-08 15:08:35 字數 3986 閱讀 3509

寫操作(write)

1) 如果你同時從同一客戶插入很多行,使用多個值表的insert語句。這比使用分開insert語句快(在一些情況中幾倍)。

insert into test values(1,2),(1,3),(1,4)… 2) 如果你從不同客戶插入很多行,能通過使用insert delayed語句得到更高的速度。delayed的含義是讓insert 語句馬上執行,其實資料都被放在記憶體的佇列中,並沒有真正寫入磁碟;這比每條語句分別插入要快的多;low_priority剛好相反,在所有其他使用者對錶的讀寫完後才進行插入。

3) 將索引檔案和資料檔案分在不同的磁碟上存放(利用建表中的選項)。

4) 如果進行批量插入,可以增加bulk_insert_buffer_size變數值的方法來提高速度,但是,這只能對myisam表使用。

5) 當從乙個文字檔案裝載乙個表時,使用loaddata infile。這通常比使用很多insert語句快20倍。

6) 根據應用情況使用replace語句代替insert。

7) 根據應用情況使用ignore關鍵字忽略重覆記錄。

關於update

a) 盡量不要修改主鍵字段。

b) 當修改varchar型字段時,盡量使用相同長度內容的值代替。

c) 盡量最小化對於含有update觸發器的表的update操作。

d) 避免update將要複製到其他資料庫的列。

e) 避免update建有很多索引的列。

f) 避免update在where子句條件中的列。

讀操作(read)

1,不要再索引欄位上進行運算,否則索引會失效。

盡量避免在where子句中對字段進行函式或表示式操作,這將導致引擎放棄使用索引而進行全表掃瞄。如:select * from t1 where f1/2=100 應改為: select * from t1where f1=100*2

2,避免使用!=或<>、is null或is not null、in ,not in等這樣的操作符

因為這會使系統無法使用索引,而只能直接搜尋表中的資料。例如: select id from employee where id != 「b%」 優化器將無法通過索引來確定將要命中的行數,因此需要搜尋該錶的所有行。在in語句中能用exists語句代替的就用exists.

3,盡量使用數字型字段

設計為字元型,這會降低查詢和連線的效能,並會增加儲存開銷。這是因為引擎在處理查詢和連線會逐個比較字串中每乙個字元,而對於數字型而言只需要比較一次就夠了。

4,合理使用exists,notexists子句

1.select sum(t1.c1) from t1 where (selectcount(*)from t2 where t2.c2=t1.c2>0)

2.select sum(t1.c1) from t1whereexists(select * from t2 where t2.c2=t1.c2)

兩者產生相同的結果,但是後者的效率顯然要高於前者。因為後者不會產生大量鎖定的表掃瞄或是索引掃瞄。如果你想校驗表裡是否存在某條紀錄,不要用count(*)那樣效率很低,而且浪費伺服器資源。可以用exists代替。如: if (select count(*) from table_name where column_name = 『***』)可以寫成:ifexists (select * from table_name where column_name = 『***』)

5,關於操作符

a,能夠用between的就不要用in

c,盡量不要用selectinto語句

常用於建立表的備份復件或者用於對記錄進行存檔 select * into new_table from old_table

d,盡量避免在索引過的字元資料中,使用非打頭字母搜尋

select * from t1 where name like 『%l%』

select * from t1 wheresubsting(name,2,1)=』l』

select * from t1 where name like 『l%』

即使name欄位建有索引,前兩個查詢依然無法利用索引完成加快操作,引擎不得不對全表所有資料逐條操作來完成任務。而第三個查詢能夠使用索引來加快操作,不要習慣性的使用『%l%』這種方式(會導致全表掃瞄),如果可以使用`l%』相對來說更好;

e,能用union all就不要用union

e1,union all不執行select distinct函式,這樣就會減少很多不必要的資源

e2,在跨多個不同的資料庫時使用union是乙個有趣的優化方法,union從兩個互不關聯的表中返回資料,這就意味著不會出現重複的行,同時也必須對資料進行排序,我們知道排序是非常耗費資源的,特別是對大表的排序。

e3,union all可以大大加快速度,如果你已經知道你的資料不會包括重複行,或者你不在乎是否會出現重複的行,在這兩種情況下使用union all更適合。此外,還可以在應用程式邏輯中採用某些方法避免出現重複的行,這樣union all和union返回的結果都是一樣的,但union all不會進行排序。

6,不要在選擇的字段上放置索引

a,應該在條件選擇的語句上合理的放置索引,比如where,order by

b,selectid,title,content,cat_id from article where cat_id = 1;

上面這個語句,你在id/title/content上放置索引是毫無意義的,對這個語句沒有任何優化作用。但是如果你在外鍵cat_id上放置乙個索引,那作用就相當大了。

7,order by語句的mysql優化

a,order by語句的mysql優化

b,where +order by + limit組合的索引優化

c,where + in +order by + limit組合的索引優化

d,where+orderby多個欄位+limit

預設情況下,mysql排序所有group by col1, col2, ....,查詢的方法如同在查詢中指定orderby col1, col2, ...。如果顯式包括乙個包含相同的列的order by子句,mysql可以毫不減速地對它進行優化,儘管仍然進行排序。

如果查詢包括group by但你想要避免排序結果的消耗,你可以指定order by null禁止排序。例如: insert into foo select a, count(*) from bar group by a order bynull;

mysql join語句的優化

這個技術可以使用select語句來建立乙個單列的查詢結果,然後把這個結果作為過濾條件用在另乙個查詢中。使用子查詢可以一次性的完成很多邏輯上需要多個步驟才能完成的sql操作,同時也可以避免事務或者表鎖死,並且寫起來也很容易。

建立索引

1、合理的建立索引能夠加速資料讀取效率,不合理的建立索引反而會拖慢資料庫的響應速度。

2、索引越多,更新資料的速度越慢。

3、盡量在採用myisam作為引擎的時候使用索引(因為mysql以btree儲存索引),而不是innodb。但myisam不支援transcation。

4、當你的程式和資料庫結構/sql語句已經優化到無法優化的程度,而程式瓶頸並不能順利解決,那就是應該考慮使用諸如memcached這樣的分布式快取系統的時候了。

5、習慣和強迫自己用explain來分析你sql語句的效能。(擴充套件:explain用法:在select語句前加上explain就可以了).

表的設計

1,據型別的不相容可能使優化器無法執行一些本來可以進行的優化操作。例如float和int、char和varchar、binary和varbinary是不相容的。

2,通過搜尋引數,儘量減少對錶的訪問行數,最小化結果集,從而減輕網路負擔。

3.能夠分開的操作盡量分開處理,提高每次的響應速度。

4,在資料視窗使用sql時,盡量把使用的索引放在選擇的首列。

5,在查詢時,不要過多地使用萬用字元如select * from t1語句,在可能的情況下盡量限制盡量結果集行數。

6,不要在應用中使用資料庫游標,游標是非常有用的工具,但比使用常規的、面向集的sql語句需要更大的開銷。

7,按照特定順序提取資料的查詢。

資料庫優化 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語句及資料庫優化

1,統一sql語句的寫法 對於以下兩句sql語句,程式設計師認為是相同的,資料庫查詢優化器認為是不同的。所以封裝成復用方法,用標準模板來控制。select from dual select from dual 其實就是大小寫不同,查詢分析器就認為是兩句不同的sql語句,必須進行兩次解析。生成2個執行...

mysql資料庫sql語句優化

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