您好,登錄后才能下訂單哦!
本篇內容主要講解“mysql有沒有索引”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“mysql有沒有索引”吧!
mysql有索引。MySQL中通常有兩種方式訪問數據庫表的行數據:1、順序訪問,即在表中實行全表掃描,從頭到尾逐行遍歷,直到在無序的行數據中找到符合條件的目標數據;2、索引訪問,就是通過遍歷索引來直接訪問表中記錄行的方式。MySQL索引的數據結構可以分為BTree和Hash兩種,BTree又可分為BTree和B+Tree。
MySQL 索引 是什么?
索引是一種特殊的數據庫結構,由數據表中的一列或多列組合而成,可以用來快速查詢數據表中有某一特定值的記錄。本節將詳細講解索引的含義、作用和優缺點。
通過索引,查詢數據時不用讀完記錄的所有信息,而只是查詢索引列。否則,數據庫系統將讀取每條記錄的所有信息進行匹配。
可以把索引比作新華字典的音序表。例如,要查“庫”字,如果不使用音序,就需要從字典的 400 頁中逐頁來找。但是,如果提取拼音出來,構成音序表,就只需要從 10 多頁的音序表中直接查找。這樣就可以大大節省時間。
因此,使用索引可以很大程度上提高數據庫的查詢速度,還有效的提高了數據庫系統的性能。
為什么要使用索引
索引就是根據表中的一列或若干列按照一定順序建立的列值與記錄行之間的對應關系表,實質上是一張描述索引列的列值與原表中記錄行之間一 一對應關系的有序表。
索引是 MySQL 中十分重要的數據庫對象,是數據庫性能調優技術的基礎,常用于實現數據的快速檢索。
在 MySQL 中,通常有以下兩種方式訪問數據庫表的行數據:
1) 順序訪問
順序訪問是在表中實行全表掃描,從頭到尾逐行遍歷,直到在無序的行數據中找到符合條件的目標數據。
順序訪問實現比較簡單,但是當表中有大量數據的時候,效率非常低下。例如,在幾千萬條數據中查找少量的數據時,使用順序訪問方式將會遍歷所有的數據,花費大量的時間,顯然會影響數據庫的處理性能。
2) 索引訪問
索引訪問是通過遍歷索引來直接訪問表中記錄行的方式。
使用這種方式的前提是對表建立一個索引,在列上創建了索引之后,查找數據時可以直接根據該列上的索引找到對應記錄行的位置,從而快捷地查找到數據。索引存儲了指定列數據值的指針,根據指定的排序順序對這些指針排序。
例如,在學生基本信息表 tb_students 中,如果基于 student_id 建立了索引,系統就建立了一張索引列到實際記錄的映射表。當用戶需要查找 student_id 為 12022 的數據的時候,系統先在 student_id 索引上找到該記錄,然后通過映射表直接找到數據行,并且返回該行數據。因為掃描索引的速度一般遠遠大于掃描實際數據行的速度,所以采用索引的方式可以大大提高數據庫的工作效率。
簡而言之,不使用索引,MySQL 就必須從第一條記錄開始讀完整個表,直到找出相關的行。表越大,查詢數據所花費的時間就越多。如果表中查詢的列有一個索引,MySQL 就能快速到達一個位置去搜索數據文件,而不必查看所有數據,這樣將會節省很大一部分時間。
MYSQL 索引 的分類
1、普通索引 和 唯一索引
普通索引:MySQL 中的基本索引類型,允許在定義索引的列中插入 重復值 和 空值
唯一索引:要求索引列的值必須 唯一,但允許 有空值
如果是組合索引,則列值的組合必須 唯一
主鍵索引是一種特殊的唯一索引,不允許 有空值
2、單列索引 和 組合索引
單列索引:一個索引只包含單個列,一個表可以有多個單列索引
組合索引:在表的 多個字段 組合上 創建的 索引
只有在查詢條件中使用了這些字段的 左邊字段 時,索引才會被使用(最左前綴原則)
3、全文索引
全文索引 的類型為 fulltext
在定義索引的 列上 支持值的全文查找,允許在這些索引列中插入 重復值 和 空值
全文索引 可以在 char、varchar 和 text 類型的 列 上創建
4、空間索引
空間索引 是對 空間數據類型 的字段 建立的索引
MySQL中的空間數據類型有4種,分別是 Geometry、Point、Linestring 和 Polygon
MySQL 使用 Spatial 關鍵字進行擴展,使得能夠用創建正規索引類似的語法創建空間索引
創建空間索引的列,不允許為空值,且只能在 MyISAM 的表中創建。
5、前綴索引
在 char、varchar 和 text 類型的 列 上創建索引時,可以指定索引 列的長度
MySQL 索引 的數據結構
?MySQL 索引 的數據結構可以分為 BTree 和 Hash 兩種,BTree 又可分為 BTree 和 B+Tree。
Hash:使用 Hash 表存儲數據,Key 存儲索引列,Value 存儲行記錄或行磁盤地址。
?Hash 只支持等值查詢(“=”,“IN”,“<=>”),不支持任何范圍查詢(原因在于 Hash 的每個鍵之間沒有任何的聯系),Hash 的查詢效率很高,時間復雜度為 O(1)。
BTree:屬于多叉樹,又名多路平衡查找樹。
性質:
BTree 的節點存儲多個元素( 鍵值 - 數據 / 子節點 的地址)
BTree 節點的鍵值按 非降序 排列
BTree 所有葉子節點都位于同一層(具有相同的深度)
查詢過程,例如:Select * from table where id = 6;
BTree 的不足:
不支持范圍查詢的快速查找(每次查詢都得從根節點重新進行遍歷)
節點都存儲數據會導致磁盤數據存儲比較分散,查詢效率有所降低
B+Tree:在 BTree 的基本上,對 BTree 進行了優化:只有葉子節點才會存儲 鍵值 - 數據,非葉子節點只存儲 鍵值 和 子節點 的地址;葉子節點之間使用雙向指針進行連接,形成一個雙向有序鏈表。
等值查詢,例如:Select * from table where id = 8;
范圍查詢,例如:Select * from table where id between 8 and 22;
B+Tree 的優點:
保證了等值查詢和范圍查詢的快速查找
單一節點存儲更多的元素,減少了查詢的 IO 次數
到此,相信大家對“mysql有沒有索引”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。