佳木斯湛栽影视文化发展公司

主頁 > 知識庫 > MySQL索引的各種類型

MySQL索引的各種類型

熱門標簽:服務(wù)外包 呼叫中心市場需求 Linux服務(wù)器 地方門戶網(wǎng)站 AI電銷 鐵路電話系統(tǒng) 百度競價排名 網(wǎng)站排名優(yōu)化

什么是索引?

索引是數(shù)據(jù)庫存儲引擎用于快速查找到指定數(shù)據(jù)的一種數(shù)據(jù)結(jié)構(gòu)。

可以用新華字典做類比:如果新華字典中對每個字的詳細解釋是數(shù)據(jù)庫中表的記錄,那么按部首或拼音等排序的目錄就是索引,使用它可以讓我們快速查找的某一個字詳細解釋的位置。

在MySQL中,存儲引擎也是用了類似的方法,先在索引中找到對應(yīng)的值,然后再根據(jù)匹配的索引值找到對應(yīng)表中記錄的位置。

面試中為什么問索引?

之所以在索引在面試中經(jīng)常被問到,就是因為:索引是數(shù)據(jù)庫的良好性能表現(xiàn)的關(guān)鍵,也是對查詢能優(yōu)化最有效的手段。索引能夠輕易地把查詢性能提高幾個數(shù)量級。

然而,糟糕的索引也同樣會影響查詢性能,當表中的數(shù)據(jù)量越來越多的時候,索引對性能的影響就越大。在數(shù)據(jù)量比較少并且負責比較低的時候,糟糕的索引對性能的影響可能不明顯,但是當數(shù)據(jù)量逐漸增多的時候,性能會急劇下降。

索引的類型

經(jīng)過前面的介紹,我們就進入正題,了解一下MySQL支持的索引類型,以及它們的原理和用法。

不同類型的索引,可以為不同場景提供更好的性能。在MySQL中,索引是在存儲引擎層面實現(xiàn)的,而不是在服務(wù)器層面實現(xiàn)的。正如大家所知道,MySQL支持多種類型的存儲引擎。所以,在不同存儲引擎中索引的實現(xiàn)方式并不是一樣的,也不是所有類型的索引都被所有存儲引擎支持的,即使多個存儲引擎支持同一種類型的索引,它底層的實現(xiàn)也有可能是不相同的。

B-Tree索引

B-Tree索引是被大多數(shù)MySQL存儲引擎支持的,在我們討論索引時,假如沒有特別地說明類型,那么大概率說的就是B-Tree索引了。我們使用B-Tree這個詞,是因為MySQL在創(chuàng)建表和其他語句中就使用這個關(guān)鍵字。

然而,在不同存儲引擎的底層可能使用不同的數(shù)據(jù)結(jié)構(gòu)和算法,比如:InnoDB存儲引擎內(nèi)部使用的是B+Tree結(jié)構(gòu),NDB集群存儲引擎內(nèi)部使用的是T-Tree結(jié)構(gòu)。不同存儲引擎用以不同的方式使用B-Tree索引,性能也可能不同,比如:InnoDB的索引上存儲的是原數(shù)據(jù)格式,而MyISAM存儲引擎使用前綴壓縮技術(shù)使索引更小,InnoDB索引的行存儲的數(shù)據(jù)行的主鍵引用,而MyISAM存儲引擎的索引的行存儲的是數(shù)據(jù)行的物理位置。

B-Tree索引的原理

B-Tree索引能夠加快訪問數(shù)據(jù)的速度,因為不需要全表掃描就可以快速檢索的需要的數(shù)據(jù)。那么B-Tree索引是怎么做到的呢?我們通過一個簡單的例子了解一下InnoDB的B-Tree索引是怎么工作的:

CREATE TABLE `om_address` (
 `province_name` varchar(255) NOT NULL COMMENT '省',
 `city_name` varchar(255) NOT NULL COMMENT '市',
 `district_name` varchar(255) NOT NULL COMMENT '區(qū)',
 `detailed_address` varchar(255) NULL DEFAULT NULL COMMENT '詳細地址',
 INDEX `index_province_city_district`(`province_name`, `city_name`, `district_name`) USING BTREE
) ENGINE = InnoDB;

這個表中共有4個字段,分別表示省、市、區(qū)和詳細地址,還有一個B-Tree索引,其中包含了省、市、區(qū)三個字段。因為索引的所有值都是按照順序存儲的,即:節(jié)點的左子樹比當前節(jié)點小,節(jié)點的右子樹比當前節(jié)點大。那么當查詢數(shù)據(jù)時,從索引的根節(jié)點開始搜索,根據(jù)比較當前節(jié)點的索引值向子樹進行查找,直到找到對應(yīng)的索引值,或者根本沒有找到。

B-Tree索引的用法

根據(jù)B-Tree索引的特點,它可以用于全值匹配、值范圍匹配和最左前綴匹配。

  • 全值匹配是指和索引中所有的字段進行匹配,比如:查詢黑龍江省哈爾濱市南崗區(qū)的數(shù)據(jù)。
  • 值范圍匹配是指索引中字段的某一范圍進行匹配,但是必須滿足前面字段的全匹配,比如:第一個字段province_name省名稱的全匹配,第二個字段city_name城市名稱的范圍匹配。
  • 最左前綴匹配是指索引中字段的某一開頭部分進行匹配,但是必須滿足前面字段的全匹配,比如:第一個字段province_name省名稱為內(nèi)蒙古,第二個字段city_name城市名稱以“呼”開頭。

哈希索引

哈希索引是基于哈希表實現(xiàn)的,用于精確匹配索引所指向的數(shù)據(jù)。存儲引擎對每一行數(shù)據(jù)的所有索引字段計算出一個哈希碼,哈希碼是一個比較小的值,并且不同的數(shù)據(jù)計算出來的哈希碼一般情況下也不一樣。哈希索引中存放了這個哈希碼和指向這個數(shù)據(jù)行的指針。

在MySQL中,只有Memory存儲引擎支持哈希索引,也是Memory存儲引擎的默認索引類型。另外,在InnoDB存儲引擎中也運用了哈希索引,叫做自適應(yīng)哈希索引。當某些索引中被非常頻繁的使用時,InnoDB存儲引擎會在內(nèi)存中基于B-Tree索引之上再創(chuàng)建一個哈希索引,這樣一來使得B-Tree索引也具有的快速哈希查找的優(yōu)點。

哈希索引因為只需存放對應(yīng)數(shù)據(jù)的哈希值,所以索引的結(jié)構(gòu)非常緊湊,占用空間小,同時查詢速度也非???。不過,哈希索引只支持全值等值查詢,不能索引字段范圍匹配和部分索引字段匹配。

空間數(shù)據(jù)索引

空間數(shù)據(jù)索引(R-Tree)主要用于地理數(shù)據(jù)的存儲,會從所有維度來索引數(shù)據(jù),查詢時可以有效的使用任意維度進行組合查詢。 目前,MyISAM存儲引擎支持空間數(shù)據(jù)索引,不過必須使用MySQL的GIS相關(guān)的函數(shù)來維護數(shù)據(jù)。

在MySQL中,空間索引只能建立在空間數(shù)據(jù)類型上,如:GEOMETRY、POINT、LINESTRING等。

全文索引

全文索引不像之前介紹的索引那樣直接比較索引中的值,而是直接比較查找的文本中的關(guān)鍵詞,它類似于搜索引擎做的事情,不是簡單的where條件匹配。

在相同的字段上,可以同時創(chuàng)建全文索引和B-Tree索引,不會有沖突。全文索引適用于match和against操作,不是普通的where條件操作。在MySQL中,只能在類型為CHAR、VARCHAR、TEXT的字段上創(chuàng)建全文索引。

總結(jié)

索引是數(shù)據(jù)庫存儲引擎用于快速查找到指定數(shù)據(jù)的一種數(shù)據(jù)結(jié)構(gòu),它包括B-Tree索引、哈希索引、空間數(shù)據(jù)索引、全文索引,其中B-Tree索引是我們最常用到的,InnoDB存儲引擎內(nèi)部使用的是B+Tree結(jié)構(gòu);哈希索引是基于哈希表實現(xiàn)的,用于精確匹配索引所指向的數(shù)據(jù);空間數(shù)據(jù)索引從所有維度來索引數(shù)據(jù),查詢時可以有效的使用任意維度進行組合查詢;全文索引是直接比較查找的文本中的關(guān)鍵詞,類似于搜索引擎。

以上就是MySQL索引的各種類型簡介的詳細內(nèi)容,更多關(guān)于MySQL 索引類型的資料請關(guān)注腳本之家其它相關(guān)文章!

您可能感興趣的文章:
  • MySQL學習教程之聚簇索引
  • MySQL8.0中的降序索引
  • MySQL 8.0 之索引跳躍掃描(Index Skip Scan)
  • MySQL索引失效的幾種情況匯總
  • 詳解MySQL 聚簇索引與非聚簇索引
  • MySQL btree索引與hash索引區(qū)別
  • MySQL 函數(shù)索引的優(yōu)化方案
  • 導(dǎo)致MySQL索引失效的一些常見寫法總結(jié)
  • MySql索引使用策略分析

標簽:黃山 湘潭 湖南 銅川 仙桃 崇左 衡水 蘭州

巨人網(wǎng)絡(luò)通訊聲明:本文標題《MySQL索引的各種類型》,本文關(guān)鍵詞  ;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 收縮
    • 微信客服
    • 微信二維碼
    • 電話咨詢

    • 400-1100-266
    龙岩市| 三原县| 宾阳县| 杂多县| 香港| 辉南县| 桦甸市| 铜川市| 广丰县| 江川县| 苏州市| 盈江县| 正蓝旗| 夹江县| 辽源市| 建瓯市| 安塞县| 调兵山市| 通州市| 四会市| 永宁县| 前郭尔| 江阴市| 洞头县| 二连浩特市| 雷州市| 綦江县| 商水县| 达拉特旗| 平阳县| 元朗区| 咸宁市| 孟津县| 台东市| 海南省| 苏尼特左旗| 昭通市| 广平县| 呼和浩特市| 汉川市| 民县|