第四章索引和事務 1. 什麼是索引?有什麼用? 1)索引是資料庫對象之一,用於加快數據的檢索,類似於書籍的目錄。在資料庫中索引可以減少資料庫程式查詢結果時需要讀取的數據量,類似於在書籍中我們利用索引可以不用翻閱整本書即可找到想要的信息。 2)索引是建立在表上的可選對象;索引的關鍵在於通過一組排序後的 ...
第四章索引和事務
1. 什麼是索引?有什麼用?
1)索引是資料庫對象之一,用於加快數據的檢索,類似於書籍的目錄。在資料庫中索引可以減少資料庫程式查詢結果時需要讀取的數據量,類似於在書籍中我們利用索引可以不用翻閱整本書即可找到想要的信息。
2)索引是建立在表上的可選對象;索引的關鍵在於通過一組排序後的索引鍵來取代預設的全表掃描檢索方式,從而提高檢索效率
3)索引在邏輯上和物理上都與相關的表和數據無關,當創建或者刪除一個索引時,不會影響基本的表;
4)索引一旦建立,在表上進行DML操作時(例如在執行插入、修改或者刪除相關操作時),oracle會自動管理索引,索引刪除,不會對錶產生影響
5)索引對用戶是透明的,無論表上是否有索引,sql語句的用法不變
6)oracle創建主鍵時會自動在該列上創建索引
2. 索引的底層實現原理
當一列索引創建成功後,oracle系統會這個列複製一個份放入緩存,並按照一定規則做排序和去重,從而減少檢索數據的範圍。但是索引不是創建的越多越好,因為一個索引的創建,就需要在緩存中開闢一個空間,過多的索引反而會加重資料庫的檢索速度。
3. 索引的設計理念
1)某個欄位在條件查詢中會被高頻率的調用 where 條件
2)表關聯的連接欄位 on 條件
3)實際業務需求
4. 索引的分類
1) 唯一索引
主鍵會預設添加索引
適用:主鍵
2)BTREE索引(預設索引)
1.oracle中最常用的索引;B樹索引就是一顆二叉樹;葉子節點(雙向鏈表)包含索引列和指向表中每個匹配行的ROWID值
2.所有葉子節點具有相同的深度,因而不管查詢條件怎樣,查詢速度基本相同
3.能夠適應精確查詢、模糊查詢和比較查詢
適用:列基數(列不重覆值的個數)大時適合使用B樹索引
3)點陣圖索引
創建點陣圖索引時,oracle會掃描整張表,併為索引列的每個取值建立一個點陣圖(點陣圖中,對錶中每一行使用一位(bit,0或者1)來標識該行是否包含該點陣圖的索引列的取值,如果為1,表示對應的rowid所在的記錄包含該點陣圖索引列值),最後通過點陣圖索引中的映射函數完成位到行的ROWID的轉換
適用:對於基數小的列適合簡歷點陣圖索引(例如性別等)
4)單列索引和複合索引
如果索引建立在多個列上,只有它的第一個列被where子句引用時,優化器才會使用該索引,即至少要包含組合索引的第一列。即索引按照順序被調用
5. 索引操作
查看索引
select * from user_indexes where TABLE_NAME='EMPLOYEES';
創建BTREE索引
CREATE INDEX index_name on table_name(colum1,colum2…);
創建點陣圖索引
CREATE BITMAP INDEX index_name on table_name(colum1,colum2…);
修改索引
alter index index_name1 rename to index_name2;
刪除索引
drop index index_sno;
索引在全局唯一
6. 圖形化操作
事務
事務是操作資料庫最小的單位,是1條或N條SQL語句組成的邏輯。
四大特性
1. 原子性A(Atomic)
事務是一個整體,不可分割,一起成功or一起失敗
2. 一致性C(Consistency)
事務執行前和執行後必須處於一致性狀態
3. 隔離性I(Isolation)
多事務併發時,相互獨立,互不影響
4. 持久性D(Durability)
資料庫數據若不變更,會永久不變
事務會造成的問題
1. 臟讀
臟讀是指在一個事務處理過程里讀取了另一個未提交的事務中的數據
2. 不可重覆讀
不可重覆讀是指在對於資料庫中的某個數據,一個事務範圍內多次查詢卻返回了不同的數據值,這是由於在查詢間隔,被另一個事務修改並提交了。
3. 幻讀
在讀寫一批數據時,發現讀取到的數據不一致,就是發生了幻覺一樣
以上問題,都是發生在多事務併發時,數據前後不一致造成的
資料庫提供的四種隔離級別:
Read uncommitted(讀未提交):最低級別,任何情況都會發生。
Read Committed(讀已提交):可避免臟讀的發生。
Repeatable read(可重覆讀):可避免臟讀、不可重覆讀的發生。
Serializable(串列化):避免臟讀、不可重覆讀,幻讀的發生。
MySQL預設級別是 可重覆讀;
Oracle 僅支持讀已提交和串列化,預設級別是 讀已提交
鎖機制
1. 共用鎖/樂觀鎖(Share Locks,即S鎖)加了共用鎖的數據對象可以被其他事務讀取和修改
2. 排它鎖/悲觀鎖(Exclusive Locks,即X鎖):當數據對象被加上排它鎖時,其他的事務不能對它讀取和修改
死鎖
1. 兩張表T1,T2
2. A用戶已訪問T1表,並加鎖T1表,嘗試訪問T2表;訪問不到T2表,就不撤T1表的鎖
3. B用戶已訪問T2表,並加鎖T2表,嘗試訪問T1表;訪問不到T1表,就不撤T2表的鎖
4. 兩個用戶就發生了死鎖