索引類型?
索引是以特殊形式在數(shù)據(jù)庫中存儲(chǔ)記錄的數(shù)據(jù)結(jié)構(gòu)。
通過索引,可以顯著提高數(shù)據(jù)查詢的效率,從而提高服務(wù)器的性能。
從專業(yè)角度講,索引是一個(gè)有序列表,其中存儲(chǔ)了索引的值和包含該值的行的物理地址。
當(dāng)數(shù)據(jù)庫非常大時(shí),索引可以大大加快查詢速度,因?yàn)槭褂盟饕螅梢远ㄎ灰恍袛?shù)據(jù),而不是掃描整個(gè)表,而是先通過索引表找到該行數(shù)據(jù)對(duì)應(yīng)的物理地址,然后訪問對(duì)應(yīng)的數(shù)據(jù)。
說到索引,其實(shí)并不是MySQL數(shù)據(jù)庫獨(dú)有的機(jī)制,在關(guān)系數(shù)據(jù)庫中也會(huì)有類似的不同實(shí)現(xiàn)。
這里我們只討論MySQL數(shù)據(jù)庫中的索引實(shí)現(xiàn)。
其實(shí)說MySQL是索引并不準(zhǔn)確。
因?yàn)樵贛ySQL中,索引是在存儲(chǔ)引擎層而不是服務(wù)器層實(shí)現(xiàn)的。
這意味著我們所說的索引正是由InnoDB引擎或MyISAM引擎或其他存儲(chǔ)引擎實(shí)現(xiàn)的。
所以即使在MySQL中,索引也沒有統(tǒng)一的標(biāo)準(zhǔn),不同的存儲(chǔ)引擎有不同的索引。
并非所有存儲(chǔ)引擎都支持相同類型的索引,即使多個(gè)引擎支持相同類型的索引,底層實(shí)現(xiàn)也可能不同。
mysql索引數(shù)據(jù)結(jié)構(gòu)區(qū)別?
B樹的簡(jiǎn)單定義如全文索引、聚集索引、哈希索引和B樹索引:B樹是一種平衡的搜索樹,是為磁盤或其他存儲(chǔ)設(shè)備設(shè)計(jì)的。B樹中的所有記錄按照鍵值的順序存儲(chǔ)在葉節(jié)點(diǎn)中,所有葉節(jié)點(diǎn)之間用指針連接。
哈希索引使用哈希表查找鍵值,時(shí)間復(fù)雜度為O(1)。
使用哈希索引時(shí),查詢鍵值的等價(jià)性非??欤渌愋偷牟樵儯绶秶樵儭⒛:樵?、排序等,都不能使用哈希索引。
這是很少使用散列索引的主要原因。
聚集索引也稱為聚集索引,它的葉節(jié)點(diǎn)存儲(chǔ)記錄。每個(gè)InnoDB表都有一個(gè)稱為聚集索引的特定索引,用于存儲(chǔ)行的數(shù)據(jù)。
如果您的表定義了主鍵,則它是聚集索引。如果沒有定義主鍵,MySQL將選擇第一個(gè)非空的唯一索引列作為聚集索引。如果表中沒有惟一索引,InnoDB將生成一個(gè)類似RowId的隱藏聚集索引。全文索引搜索條件使用匹配條件。全文搜索索引是通過倒排索引實(shí)現(xiàn)的。
倒排索引記錄了每個(gè)關(guān)鍵字在文檔文本中的位置。