sql語句沒寫好可能導致:
1)網速不給力,不穩定。
2)伺服器記憶體不夠,或者sql 被分配的記憶體不夠。
3)sql語句設計不合理
4)沒有相應的索引,索引不合理
5)沒有有效的索引檢視
6)表資料過大沒有有效的分割槽設計
7)資料庫設計太2,存在大量的資料冗餘
8)索引列上缺少相應的統計資訊,或者統計資訊過期
那麼怎麼對sql進行優化呢?
1.不查詢多餘的行與列
盡量不要使用 select * 去查詢,應該使用具體的那一列代替 * ,避免多餘不需要使用的列。
使用where條件判斷具體要查詢的資料避免查詢出多餘的列。
2.謹慎使用distinct關鍵字
distinct在查詢乙個字段或者很少欄位的情況下使用,會避免重複資料的出現,給查詢帶來優化效果。
但是查詢字段很多的情況下使用,則會大大降低查詢效率。
3.連線查詢的優化
首先你要弄明白你想要的資料是什麼樣子的,然後再做出決定使用哪一種連線,這很重要。
各種連線的取值大小為:
內連線結果集大小取決於左右表滿足條件的數量
左連線取決與左表大小,右相反。
完全連線和交叉連線取決與左右兩個表的資料總數量
4.應盡量避免在 where 子句中對字段進行 null 值判斷,否則將導致引擎放棄使用索引而進行全表掃瞄,如:
select id from t where num is null --可以在num這個列上給個預設約束等於0 然後 num = 0
5.應盡量避免在 where 子句中使用 or 來連線條件,否則將導致引擎放棄使用索引而進行全表掃瞄,如:
select id from t where num=10 or num=20 --這種不就是相當於是個in嗎? in不就是不走引索的嗎
#可以這樣查詢:
select id from t where num=10
union all
select id from t where num=20
6.模糊搜尋
select id from t where name like '%abc%' --也將導致全表掃瞄
'%abc' 這種也將導致全表掃瞄,盡量使用 'abc%' ---後通配 走索引 前通配 走全表。
若要提高效率,可以考慮全文檢索。
7.in 和 not in 也要慎用,否則會導致全表掃瞄,如:
select id from t where num in(1,2,3)
-- 對於連續的數值,能用 between 就不要用 in 了:
select id from t where num between 1 and 3
8.很多時候用 exists 代替 in 是乙個好的選擇:
select num from a where num in(select num from b)
用下面的語句替換:
select num from a where exists(select 1 from b where num=a.num)
9.索引並不是越多越好,索引固然可以提高相應的 select 的效率,但同時也降低了 insert 及 update 的效率,因為 insert 或 update 時有可能會重建索引,所以怎樣建索引需要慎重考慮,視具體情況而定。乙個表的索引數最好不要超過6個,若太多則應考慮一些不常使用到的列上建的索引是否有必要。10.不使用子查詢
select * from t1 where id in(select id from t2 where name='******wu');--避免使用
子查詢在mysql5.5版本裡,內部執行計畫器是這樣執行的:先查外表再匹配內錶,而不是先查內錶t2,當外表的資料很大時,查詢速度會非常慢。
在mariadb10/mysql5.6版本裡,採用join關聯方式對其進行了優化,這條sql會自動轉換為
select t1.* from t1 join t2 on t1.id = t2.id where t2.name="******wu";
11. !=或者<>(不等於),可能導致不走索引,也可能走 index fast full scan不知道sql語句是否走引索?可以這樣
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...