insert ,不會提高,insert 用不到索引,只會增加維護索引的時間。
delete ,如果條件用到索引了,會提高,沒有用到,會全表掃描。 也不會提高。
update ,更新索引列不會提高,少量更新非索引列,會有提高 ; 因為更新索引列,索引要重新維護,更新非索引列,倒是沒什么影響 。
如果table上有唯一索引,insert時索引可以幫助快速查找是否有重復,某種意義上也可以提高性能。但這也要跟維護索引的代價想比較(delete、update也有這個問題)。
(1)insert操作
insert的過程是,先把數據插入到表中,然后再把數據插入到相關索引中,如果這個表有5個索引,那么就得維護這5個索引,不管這個插入的數據是否為NULL值。
所以,索引個數越多,對於insert操作來說,維護的成本就越大,插入一條數據的速度也就越慢。
如果發現插入速度很慢,可以檢查一下是否這個表的索引太多了。
把數據插入索引的過程中,為了維護索引中字段的順序,會先在索引中查找這個值,如果能找到,就把這個值查到后面空閑的地方,如果沒有找到,就先把值加入到葉子節點,然后在分支節點中新增這個值 和 指向葉子節點的指針(就是一個地址)。
在這個過程中,如果某個頁滿了,還要新申請一個空的頁,把滿的頁拆分開,把一半的索引數據放到空閑頁中,而且為了保證數據的一致性(這個插入操作是並發的,可能有幾十上百個線程同時進行),會給相關的索引頁加上閂鎖(一種更低級別的內存鎖)。
如此看來,這個過程的開銷是很大的。
(2)delete操作
delete操作剛好和isnert相反,當刪除一條數據時,會把這條數據涉及到的多個索引中的數據刪除。
比如:A表包含字段 ID,name,age,memo,biz_date,storeID,employeeID,update_date,等字段,在name、age、biz_date、storeID、employeeID字段上分別創建了索引,也就是總共有5個索引。
現在運行 delete from A where ID = 100
就得把ID=100的這條數據,在各個索引中刪掉,開銷要比insert小。
(3)update操作
這個操作不同於insert,delete,只有當update的這個字段,涉及到索引時,才需要維護索引,相對來說開銷要小一些。
比如:update A set memo=‘備注信息’ where ID = 100,因為更新的memo字段上並沒有索引,所以不需要維護索引,
而update A set storeID=12345 where ID = 100,只需要更新storeID字段的索引,其他4個索引不需要維護。
————————————————
版權聲明:本文為CSDN博主「不想長大啊」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/yupeigu/java/article/details/79129776