當偏移量特別大時,limit效率會非常低。
select id from a limit
1000
,10 很快
select id from a limit
90000
,10 很慢
方案一:select id from a order
by id limit
90000,10
;
如果我們結合order by 試用。 很快, 因為使用了主鍵索引 ,或者根據業務邏輯使用索引。
方案二:
select id from a order
by id between
90000
and90010
;
反例
insert
into person(name,age)
values
('a',24
)insert
into person(name,age)
values
('b',24
)insert
into person(name,age)
values
('c',24
)正例insert
into person(name,age)
values
('a',24
),('b',24
),('c',24
),
任何情況都不要用 select * from table ,用具體的字段列表替換"*",不要返回用不到的字段,避免全盤掃瞄
反例
select id from a where name like
'%abc%'
正例select nick_name from member where nick_name like
'小明%'
通常使用 union all 或 union 的方式替換「or」會得到更好的效果。where子句中使用了or關鍵字,索引將被放棄使用。
反例
select id from a where num =
10or num =
20正例
select id from a where num =
10union
allselect id from a where num=
20
反例
select id from a where num is
null
在where子句中使用 is null 或 is not null 判斷,索引將被放棄使用,會進行全表查詢。
正例
優化成num上設定預設值0,確保表中num沒有null值,
isnull 的用法在實際業務場景下sql使用率極高,我們應注意避免全表掃瞄
select id from a where num=
0
is not null不管字段是否為空都不會走索引,is null在字段允許為空時會使用索引!
不要在where子句中的「=」左邊進行函式、算數運算或其他表示式運算,否則系統將可能無法正確使用索引。
反例
select id from a where datediff(
day,createdate,
'2019-11-30')=
0 正例
select id from a where createdate>=
'2019-11-30'
and createdate<
'2019-12-1'
反例select id from a where
year
(addate)
<
2020
正例select id from a where addate<
'2020-01-01'
mysql查詢只是用乙個索引,因此如果where子句中已經使用了索引的話,那麼order by中的列是不會使用索引。因此資料庫預設排序可以符合要求情況下不要使用排序操作;
盡量不要包含多個列的排序,如果需要最好給這些列建立復合索引。
union和union all的差異主要是前者需要將兩個(或者多個)結果集合並後再進行唯一性過濾操作,這就會涉及到排序,增加大量的cpu運算,加大資源消耗及延遲。所以當我們可以確認不可能出現重複結果集或者不在乎重複結果集的時候,盡量使用union all而不是union
inner join內連線也叫等值連線是,left/rightjoin是外連線。
子查詢的效能又比外連線效能慢,盡量用外連線來替換子查詢。
mysql是先對外表a執行全表查詢,然後根據uuid逐次執行子查詢,如果外層表是乙個很大的表,我們可以想象查詢效能會表現比這個更加糟糕。
反例
select
*from a where
exists
(select
*from b where id>=
3000
and a.uuid=b.uuid);正例
select
*from a inner
join b on a.uuid=b.uuid where b.uuid>=
3000
; 這個語句執行測試不到一秒;
使用join時候,應該用小的結果驅動大的結果
left join 左邊表結果盡量小,如果有條件應該放到左邊先處理,right join同理反向。如:
反例
select
*from a left
join b a.id=b.ref_id where a.id>
10正例
select
*from
(select
*from a wehre id >
10) t1 left
join b on t1.id=b.ref_id;
select
*from a where id in
(select id from b )
select
*from a where id exists
(select
1from a.id= b.id )
in()適合b錶比a表資料小的情況
exists()適合b錶比a表資料大的情況
SQL 語句優化 OR 語句優化案例
從上海來到溫州,看了前幾天監控的sql語句和資料變化,發現有一條語句的io次數很大,達到了150萬次io,而兩個表的資料也就不到20萬,為何有如此多的io次數,下面是執行語句 select ws.nodeid,wi.laststepid,wi.curstepid from workflowinfo ...
sql語句優化!
1.不要使用in操作符,這樣資料庫會進行全表掃瞄,推薦方案 在業務密集的sql當中盡量不採用in操作符 a 改為 a 4.is null 或is not null操作 判斷字段是否為空 5.及 操作符 大於或小於操作符 大於或小於操作符一般情況下是不用調整的,因為它有索引就會採用索引查詢,但有的情況...
SQL語句優化
explain sql 反饋sql語句執行資訊 1 優化 select min id as nid,uid pmzongfen updatetime picid gg from qd mouldu qd sell limit 1 select uid pmzongfen updatetime pic...