關於SQL效能優化及注意事項

2021-10-25 18:37:46 字數 4046 閱讀 5740

possible_keys:表示查詢時,可能使用的索引

key:表示實際使用的索引

key_len:索引欄位的長度,在組合索引中判斷索引被使用的情況尤為重要

ref:列與索引的比較

rows:掃瞄出的行數

filtered:按表條件過濾的行百分比

extra:執**況的描述與說明

關於索引的劃分

雜湊索引 :通過hash值來維護索引,理論上在衝突較小(即重複資料少)的情況下,效率要比普通索引高很多。(使用頻率很小,僅做了解

alert table

addindex

using

hash

(coulmn)

組合索引

alert table

addindex

(column1,column2)

覆蓋索引 (由於mysql自帶sql優化的能力,對於索引也是擇優選擇,因此一般不會去考慮使用覆蓋索引(除非你是資料庫大牛),僅做了解):需要查詢的所有欄位及條件中的字段都可以從索引中找到。換句話說就是查詢的列和條件被使用的索引覆蓋了。

針對索引進行優化:

select

*from

table

where id >=

(select id from

table

order

by id limit

1000000,1

)limit

30

select

*from

table

as t1 join

(select id from

table

order

by id desc

limit

(($page-1)

*$pagesize),1

as t2 where t1.id <= t2.id order

by t1.id desc

limit $pagesize

4、盡量避免在where子句中對字段進行is null值判斷,否則將導致引擎放棄使用索引而進行全表掃瞄。

select id from

table

where num is

null

設定欄位時,盡量不要使用null填充字段,因為null同樣占用空間。如:char(100)型,在字段建立時空間就固定了,不管是否插入值(null也包含在內),都是占用 100 個字元的空間,但varchar欄位中,null不占用空間。

5、盡量避免在where子句中使用!= 或 < >操作符,否則將導致引擎放棄使用索引而進行全表查詢

6、盡量避免在where子句中使用or來連線條件,如果乙個欄位有索引,乙個字段沒有索引,將導致引擎放棄使用索引而進行全表掃瞄,如:

select id from

table

where num=

5or name=

'miger'

可以修改語句,通過使用unionunion all(包含重複項)來拼接兩個查詢結果:

select id from

table

where num=

5union

allselect id from

table

where name=

'miger'

7、關於inexists,需要考慮要查詢的兩張表的大小關係。

也可以嘗試使用exists代替in

select num from a where num in

(select num from b)

替換成:

select num from a where

exists

(select

1from b where num=a.num)

這裡可以注意到我使用的是 1 而不是 ,select 1 from table / select * from table 在用法上大同小異,都是檢視表中是否有記錄,select 1 from table 中的 1 是一常量,查到的所有行的值都是它。但從效率講 1>,因為不用查字典表。

8、在使用關鍵字like進行模糊查詢時,盡量避免第乙個字元就是%的情況出現 如:『%***%』%***,會使引擎放棄使用索引而進行全表掃瞄,如:

select id from

table

where name like

'%世俗%'

只要第乙個字元不是%,查詢時都會使用索引。

9、盡量避免在where子句中對字段使用函式或觸發器。

10、查詢是否會產生臨時表,臨時表的資料量是不是很大。

11、當無條件時,查詢表中的精確資料,count(*)count(column)效率高

12、關聯查詢需要explain檢視查詢順序,通常情況下mysql會用資料最少的一張表作為第一順序查詢,此時把索引建在第二張表的查詢比較高效

13、當遇到多張表關聯查詢時,mysql的優化方式是把查詢次數最少的那張表作為最外層查詢的表,優先使用那張表的索引。我們也可以通過hint命令指定表的查詢順序,將join換成straight_join來指定表的執行順序。

14、當關聯(join、left join等)多表查詢多個資料時,可以考慮拆分成兩個查詢,乙個查詢作為原來查詢的列和查詢的條件,另乙個查詢做乙個列的查詢並做第乙個查詢的過濾條件。根據阿里的開發規範手冊建立,關聯的表最多不要超過3張表

15、盡量使用union all而非union,使用union時,將條件寫在子查詢中。

針對表結構設計優化

需要關注的問題

limit的用法和分頁查詢優化

這個建議挑著看吧。

sql 優化注意事項

1.儲存過程比sql語句效率高 儲存過程經過預編譯處理 而sql查詢沒有 2.給表建立索引的字段 常見字段是where 後的條件字段 3.查詢表時使用 nolock 查詢語句不會阻塞 4.不要使用 select from dbo.table 用具體的字段列表代替 不要返回用不到的任何字段。同時避免使...

Feign效能優化注意事項

參考 一 feignclient註解 feignclient註解被 target elementtype.type 修飾,表示feignclient註解的作用目標在介面上 1 2 3 4 5 feignclient name github client url configuration githu...

Feign效能優化注意事項

一 feignclient註解 feignclient註解被 target elementtype.type 修飾,表示feignclient註解的作用目標在介面上 feignclient name github client url configuration githubexampleconfi...