關於sql的一點心得

2022-06-16 09:24:11 字數 2026 閱讀 5037

積累了一定的後端開發經驗,談一下寫sql的一點心得

1.select * from   * 一定要要慎用,最好是只返回你需要的列,否則效率會很低

2.游標要慎用,之前從因為記憶體不足的原因,使用游標從資料庫中讀資料,

游標實際上就是分批放入記憶體,實際上減小了記憶體的占用,但效率會變低

3.索引要建立在經常做查詢的列上

4.防止索引失效是很關鍵的

(1) 最左字首法則:比如create index 了三個索引,進行查詢匹配時,要按順序走索引

alter  table  `table_name`  add  index index_name (  `column1`,  `column2`,  `column3`  )

查詢時符合最左字首:

select id from tablename where column1 = 「spx」;      

select id from tablename where column1 = 「spx」 and column2= "spx"

select id from tablename where column1 = 「spx」 and column2 ="spx" and column3="spx"

違背最左字首,索引全部失效:

select id from tablename where column2 = 「spx」  and column3="spx"

符合最左字首,只有左列索引生效(跳躍了某一索引列):

select id from tablename where column1 = 「spx」  and column3="spx"

(2) 索引列進行運算操作,索引將失效

(3)使用or 時如果or之前是索引列,or之後不是那麼索引失效,所以限制條件字段沒有索引就少用or;

解決方案:可以使用union 或者union all 效果更好,但是盡量要使用 union all ,

因為前者要加結果集合並後再進行過濾操作,增大cpu運算,但是union all 前提是倆個結果集沒有重複資料

column1 --索引列   column 2 -- 不是索引列

索引失效:select id from tablename where conlumn1 ="spx"  or conlumn2="spx";

解決: select id from tablename   where conlumn1=「spx」

union all 

select id from tablename  where conlumn2="spx";

(4)模糊查詢時,以%開頭,索引失效,盡量都寫成尾部模糊匹配

(5) is null,is not null 有時索引失效

(6) 索引列資料型別不匹配,比如 column1 的型別是varchar

eg: select id from  tablename where  column1 = 1;   沒有加引號,會自動轉型別導致索引失效 

5.復合索引大多數情況下效率高於單列索引,因為多條件聯合查詢時,mysql優化器會評估哪個條件的索引的效率高,會去選擇最佳的索引

6.要經常使用 explain  來檢視 sql 的執行計畫,這算乙個很好的習慣,比較sql的效能,檢視該語句是否使用了索引等等,真的很重要!!

7. in 和 exists , not in 和 not exists 小結

select *from tablename1 where id in (select id from tablename2)

上面的sql等於下面這個

select *from tablename1 where exists(select id tablename2 where tablename2.id = tablename1.id)

根據驅動的順序可知,in先執行子查詢,in適合於外表大而內錶小的情況,exists先對外表做loop迴圈,所以適合於外表小而內錶大的情況

not in 內外表都進行全表掃瞄,而 not exists 得子查詢依然能用到表上的索引,所以一定要使用 not exists

剩下的後面繼續補充

SQL一點心得

sql語句將所有 stock 表裡的 縮寫 led甲 替換改寫成 led刷 update dbo stock set 縮寫 replace 縮寫 led甲 led刷 where 縮寫 like led甲 go字首 update mytable set myfield replace myfield,...

關於SQL優化的一點心得

因為專案中的幾個sql比較執行速度比較慢,所以最近一直在優化這幾個sql,在優化的過程中,還是挺有意思,因為每進 行一點改進,可能對執行效率都有一點的改善。在這個方面,也總結了一些小小的經驗,這些經驗都是建立在orcle系統之上 的 1 在做聯合查詢時,注意對錶中的資料進行預估,然後決定查詢時表的先...

關於call user func的一點心得

好久沒寫部落格實在是慚愧,最近寫乙個控制器程式,程式獲取頁面提交引數為程式中乙個類的方法。比如,頁面有不同的按鈕可以讓使用者觸發 getmethod a 和 getmethod b getmethod n 控制器在得到引數之後如何呼叫類中對應的方法?就需要用到call user func 按手冊照葫...