SQL優化:
- 創建索引,使用索引加快查詢速度
- 不要氾濫的使用索引
- 對於刪除、添加,性能降低
- 對於查詢、修改, 性能提升
- 查詢時,不要使用select * ,因爲會對所有列進行查詢,降低性能;
- 儘量使用具體的列名,代替select *;
- 優先考慮在 where 、 group by 後使用索引列;
- 查詢的時候儘量不要使用 in 或者not in,因爲容易造成全表掃描;
- 使用模糊查詢關鍵字like,模糊字一定不要加在%左邊,要加在右邊;
- 儘量不要使用or,可能會導致全表掃描;
- 儘量不要在索引列上參與運算,會導致索引失效;
- where後面儘量不要使用 is null 或者 is not null ,可能會導致索引失效;
- where 後面不要加 1=1 會造成全表掃描;
- 連表儘量不要超過兩張表;
- 儘量避免大事務,儘量使用分頁查詢 分頁關鍵字(limit)
- 聯合索引 也會失效,列中包含非索引列 會失效。
某些大廠中的一些規範(例如途牛):
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個索引不需要維護。