C# 委託與事件的複習
索引
1、索引:一種用於快速查詢和檢索資料的資料結構 B樹、B+樹、Hash
2、優缺點:
=(1)優點:可以大大加快資料的檢索速度、建立唯一性索引可以保證資料庫表中每行資料的唯一性;一般情況下,索引查詢比全表查詢要快的
=(2)缺點:建立和維護索引需要消耗時間,對有索引的資料進行增刪改時,索引需要動態修改,會降低sql執行效率;索引需要使用物理檔案儲存,會消耗一定的空間
3、索引底層資料結構
=(1)Hash表:K-V鍵值對、雜湊演算法、雜湊衝突(鏈地址法)
MySQL沒有使用的原因:Hash衝突問題;Hash索引不支援順序和範圍查詢(只能用於精準定位)
=(2)B樹:多路平衡查詢樹
B樹的所有節點集存放鍵key也存放資料data
葉子節點是獨立的
檢索過程相當於對每個節點關鍵字做二分查詢,不穩定
=(3)B+樹:B樹的變體
B+樹只有葉子節點存放key和data,其它節點存放key
B+樹葉子節點有一條鏈指向相鄰的葉子節點
B+樹檢索穩定,從根節點號葉子節點的過程,葉子節點的順序檢 索明顯
=(4) InnoDB和MyISAM——索引的區別
==相同點:都是使用B+Tree 索引結構
==不同點:
MyISAM:B+Tree葉子節點的data域 存放的是 資料記錄的地址
檢索時,先按照B+Tree搜尋索引,指定的key存在,取出data的值,根據data值即地址,讀取相應的資料記錄 (“非聚簇索引”)
InnoDB:資料檔案本身就是索引檔案
B+樹的葉子節點的data域儲存了完整的資料記錄
檢索時,搜尋索引,指定的key存在,key時資料表的主鍵,innodb表資料檔案本身就是索引檔案。(聚簇索引),其餘的索引作為輔助索引,輔助索引的data域儲存相應記錄主鍵的值。
在根據主索引搜尋時,找到key所在的葉子節點可以取出資料;在根據輔助索引搜尋時,則需要先取出主鍵的值,再走一遍主索引。
4、索引型別
=(1)主鍵索引:資料表的主鍵列使用的就是主鍵索引
InnoDB表中,沒有顯示指定表的主鍵時,會自動先檢查表中是否有唯一索引且不允許存在null值的欄位
有則選擇該欄位為預設的主鍵,沒有就欄位建立一個6byte的自增主鍵。
=(2)二級索引(輔助索引):葉子節點儲存的資料是主鍵
通過二級索引,可以定位主鍵的位置。
唯一索引、普通索引、字首索引等屬於二級索引
唯一索引(unique key):屬性列不能出現重複的資料,可以為null,一張表允許建立多個唯一索引
普通索引(index):為了快速查詢資料,一張表允許建立多個普通索引,允許資料重複和null
字首索引(prefix):只適用於字串型別的資料,對文字的前幾個字元建立索引
全文索引(full text):為了檢索大文字資料中的關鍵字的資訊
5、聚簇索引和非聚簇索引
=(1)聚簇索引:索引結構和資料一起存放的索引 主鍵索引
B+樹非葉子節點儲存索引,葉子節點儲存索引和資料
優點:查詢速度快,葉子節點有序
缺點:依賴於有序的資料,更新代價大
=(2)非聚簇索引:索引結構和資料分開存放的索引 二級索引
非聚簇索引的葉子節點不一定存放資料的指標,可能存放主鍵,再根據主鍵回表查詢資料
優點:更新代價比聚簇索引小,因為葉子節點不存放資料
缺點:依賴於有序的資料;可能會二次查詢(回表)
=(3)覆蓋索引:索引包含所有需要查詢的欄位的值
非聚簇索引不一定會回表查詢
需要查詢的欄位正好是索引的欄位,可以直接根據該索引查到資料,無需回表查詢
6、適合建立索引的條件
=(1)不為null的欄位:null欄位難優化,建議使用0,1,true,false
=(2)被頻繁查詢的欄位
=(3)被作為條件查詢的欄位:被作為where條件查詢的欄位
=(4)頻繁需要排序的欄位:索引已經排序,可以利用索引的排序,加快排序查詢的時間
=(5)被經常頻繁用於連線的欄位:可能是一些外來鍵列,外來鍵列不一定要建立外來鍵,該列涉及到表和表的關係,頻繁被連線查詢的欄位,可以建立索引
=(6)多考慮建立聯合索引:建立索引要佔用磁碟空間,每個索引對應一顆B+樹,聯合索引中多個欄位在一個索引上,可以節約磁碟空間,修改資料操作效率也會提升
7、為表字段新增索引的語句
=(1)新增主鍵索引primary key
alter table table_name ADD PRIMARY KEY(column)
=(2)新增唯一索引unique
alter table table_name ADD UNIQUE(column)
=(3)新增普通索引index
alter table table_name ADD INDEX Index_name(column)
=(4)新增全文索引fulltext
alter table table_name ADD FULLTEXT(column)
=(5)新增多列索引