一些常見的SQL優化方式

SQL優化:

  1. 創建索引,使用索引加快查詢速度
    1. 不要氾濫的使用索引
    2. 對於刪除、添加,性能降低
    3. 對於查詢、修改, 性能提升
  2. 查詢時,不要使用select * ,因爲會對所有列進行查詢,降低性能;
    1. 儘量使用具體的列名,代替select *;
  3. 優先考慮在 where 、 group by 後使用索引列;
  4. 查詢的時候儘量不要使用 in 或者not in,因爲容易造成全表掃描;
  5. 使用模糊查詢關鍵字like,模糊字一定不要加在%左邊,要加在右邊;
  6. 儘量不要使用or,可能會導致全表掃描;
  7. 儘量不要在索引列上參與運算,會導致索引失效;
  8. where後面儘量不要使用 is null 或者 is not null ,可能會導致索引失效;
  9. where 後面不要加 1=1 會造成全表掃描;
  10. 連表儘量不要超過兩張表;
  11. 儘量避免大事務,儘量使用分頁查詢 分頁關鍵字(limit)
  12. 聯合索引 也會失效,列中包含非索引列 會失效。

某些大廠中的一些規範(例如途牛):

a.一個查詢語句返回的行數不得超過200行

b.一條SQL語句運行的時間 控制在200毫秒以內

****-------******************--------------------------****************************--------------------------------------------------***********************

面試題:

問題1:請你說一說使用索引對增刪改查的影響?

  • 降低插入操作性能:insert的過程是,先把數據插入到表中,然後再把數據插入到相關索引中,如果這個表有5個索引,那麼就得維護這5個索引,不管這個插入的數據是否爲NULL值。所以,索引個數越多,對於insert操作來說,維護的成本就越大,插入一條數據的速度也就越慢。

PS:將數據插入到索引的過程:爲了維護索引中字段的順序,會先在索引中查找這個值,如果能找到,就把這個值插到後面空閒的地方,如果沒有找到,就先把值加入到葉子節點,然後在分支節點中新增這個值 和 指向葉子節點的指針(就是一個地址)。這個過程中,如果某個頁滿了,還要新申請一個空的頁,把滿的頁拆分開,把一半的索引數據放到空閒頁中,而且爲了保證數據的一致性(這個插入操作是併發的,可能有幾十上百個線程同時進行),會給相關的索引頁加上閂鎖(一種更低級別的內存鎖)。

  • 降低刪除操作性能:當刪除一條數據時,會把這條數據涉及到的多個索引中的數據刪除。
  • 提升修改操作性能這個操作不同於insert,delete,只有當update的這個字段,涉及到索引時,才需要維護索引,相對來說開銷要小一些。

比如:update A set memo=‘備註信息’ where ID = 100,因爲更新的memo字段上並沒有索引,所以不需要維護索引,

而update A set storeID=12345 where ID = 100,只需要更新storeID字段的索引,其他4個索引不需要維護。

 

 

 

 

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章