引擎聚集索引
輔助索引
聯合索引
命令單列索引
乙個索引只包含單個列,一張表可以有多個單列索引
組合索引
乙個索引包含多個列
查詢速度快
更新速度慢,不僅要更新資料,還要更新索引檔案
占用磁碟空間
hash、b+樹
b+樹是對資料進行排序,
再分組記錄,可以進行範圍查詢,支援排序,採用的是b+樹,時間是log
hash是直接計算hash值,
因此hash不支援範圍查詢,不支援排序
因為hash位址會衝突,需要再比較鍊錶的資料內容
當hash衝突少時,hash查詢比較快,時間是o(1)+o(logt)
b+:innodb、myisam
myisam表資料檔案與索引檔案時分離的,索引檔案只記錄記錄再磁碟中的儲存位址,可以不需要主鍵
innodb有表資料的ibd檔案,表資料檔案就是主索引,葉節點的data域儲存了完整的資料資訊,按照主鍵聚集,所以要有主鍵,如果沒有定義的話,會採用隱藏列中的行id來作為主鍵
因為inndob的資料檔案要按照主鍵聚集,所以innodb要求表必須要有主鍵(myisam可以沒有),
如果沒有顯式定義,則mysql系統會自動選擇乙個可以唯一標識資料記錄的列作為主鍵,
如果不存在這種列,則mysql會自動為innodb表生成乙個隱含字段作為主鍵,這字段的長度為6個位元組,型別為長整型.
1、從磁碟中載入一頁資料,
2、在記憶體中通過二分查詢,
確定資料的範圍,鎖定第二頁的指標,
3、把第二頁載入到記憶體,再二分查詢,確定範圍,鎖定指標,
4、直到找到資料。
欄位要盡量小,當樹高度越高,就需要多次載入資料,搜尋效率比較低,所以欄位要盡量小,存的資料會比較多,減少佔的頁數
最左匹配特性,b+樹是採用從左到右的順序來建樹的,查詢是也是通過第乙個比較因子來確定搜尋範圍,如果沒有第乙個比較因子,就沒辦法確定從哪開始搜尋。如果有3個比較條件,只給了頭尾,可以第乙個採用索引確定下乙個要搜尋的節點,在對這個範圍的資料利用第3個比較條件進行匹配。
索引分成2類:
根據hash值進行定位,因為會有hash衝突,索引最後要把查詢的元素跟鍊錶中的元素做乙個匹配,得到結果,
當hash衝突比較少時,時間複雜度是o(1)
將資料進行排序,分組,分組是存在頁中,每頁中還要頁目錄,再用頁儲存頁號跟每一頁的主鍵的最小值,同一層的頁之間是雙向鍊錶,資料頁之間也是雙向鍊錶
本質:搜尋是通過減少搜尋範圍以及二分查詢可以提高查詢速度
因為cpu從磁碟每次都讀取一頁,當樹的高度比較高時,讀取的次數就會比較多,降低查詢速度,所以可以減少欄位的大小,使一頁中存放更多的資料,減少樹的高度
從左到右進行建樹,查詢時需要通過第乙個比較條件確定下一步搜尋範圍,如果沒有第乙個比較條件,就無法確定搜尋範圍,如果有第乙個跟最後乙個,會先確定搜尋範圍,然後對這個範圍的所有資料根據最後乙個比較條件進行匹配(這個就沒有索引了)
#不同的儲存引擎支援的索引型別也不一樣
innodb 支援事務,支援行級別鎖定,支援 b-tree、full-text 等索引,不支援 hash 索引;
myisam 不支援事務,支援表級別鎖定,支援 b-tree、full-text 等索引,不支援 hash 索引;
memory 不支援事務,支援表級別鎖定,支援 b-tree、hash 等索引,不支援 full-text 索引;
ndb 支援事務,支援行級別鎖定,支援 hash 索引,不支援 b-tree、full-text 等索引;
archive 不支援事務,支援表級別鎖定,不支援 b-tree、hash、full-text 等索引;
採用主鍵對每張表建立b+樹,就是用主鍵對資料進行排序
同一層的頁之間按照主鍵從左到右是雙向鍊錶
資料頁之間按照主鍵從左到右是雙向鍊錶
資料頁內的記錄按照主鍵從左到右是單向鍊錶
葉子節點儲存每一行的記錄
不需要用index語句去建立,innodb預設的資料儲存方式就是這種方式
查詢最後幾個時,雙向鍊錶可以倒序
查詢範圍時,葉節點的上層節點可與得到頁範圍
表中除了聚集索引外其他索引都是輔助索引(secondary index,也稱為非聚集索引)
用我們指定的索引列來排序
葉節點儲存的是主鍵跟索引列,
目錄頁儲存的不是主鍵跟頁號,是索引列跟主鍵、頁號
需要再通過主鍵到聚集索引查詢到記錄(回表)
目錄頁的記錄的唯一的
佔的空間小,可以減少頁,所以計較快
採用多個列來作為排序的規則,也是輔助索引
先按照前面的列進行排序,相同的話再考慮後面的列
普通索引
index:加速查詢
唯一索引:
主鍵索引primary key(不為空、不重複):加速查詢+約束
唯一索引unique:(不重複):加速查詢+約束
聯合索引:
聯合主鍵primary key(id+……)
聯合唯一unique(id+……)
聯合普通index(id+……)
建立表時建立
unique key id_id(id)
index id_name(name)
在已存在的表上建立
create index id_id on gyy5(message(20));
create index id_id on gyy5(name);
修改表結構時建立
alter table gyy5 add index age int;
刪除alter table gyy5 drop index ix_t;
drop index ix_m on gyy5;
檢視表結構
show columns from gyy5
MySQL索引原理之索引原理
索引定義 是儲存引擎用於快速查詢記錄的一種資料結構。需要額外開闢空間和資料維護工作。索引是物理資料頁儲存,在資料檔案中 innodb,ibd檔案 利用資料頁 page 儲存。索引可以加快檢索速度,但是同時也會降低增刪改操作速度,索引維護需要代價。索引涉及的理論知識 二分查詢法 hash和b tree...
mysql 索引總結 mysql索引總結
mysql中每乙個表都有乙個聚簇索引clusted index,該所索引是預設建立的,除此之外的表上的每乙個非聚簇索引都是二級索引,又叫輔助索引 secondary indexes 以innodb來說,每個innodb表具有乙個特殊的索引稱為聚集索引,如果您的表上定義有主鍵,該主鍵索引是聚集索引,如...
mysql索引 mysql索引實現原理
什麼是索引 索引是一種高效獲取資料的儲存結構,例 hash 二叉 紅黑。mysql為什麼不用上面三種資料結構而採用b tree 若僅僅是 select from table where id 45 上面三種演算法可以輕易實現,但若是select from table where id 6 就不好使了...