??世界上最美好的東西之一,就是你每天都有機會開始全新的一天。??
??作者:不能再留遺憾了??
??專欄:MySQL學(xué)習(xí)??
??本文章主要內(nèi)容:詳細介紹如何查看、創(chuàng)建和刪除MySQL索引,以及MySQL索引的底層原理:B+樹。??
前言
各位朋友們,大家好!前面我們已經(jīng)介紹了MySQL的庫和表操作,今天我將為大家分享使數(shù)據(jù)庫查詢更加高效的MySQL索引,如果大家覺得博主的文章對你有用的話,記得點個贊哦!??
什么是MySQL索引
MySQL索引是一種用于加速對MySQL數(shù)據(jù)庫表中數(shù)據(jù)的查找的數(shù)據(jù)結(jié)構(gòu)。它可以幫助MySQL數(shù)據(jù)庫在查詢時快速定位到所需數(shù)據(jù),從而提高查詢效率。
MySQL索引基于數(shù)據(jù)表的某一列或多列創(chuàng)建,并按照一定的算法進行排序存儲,以快速地返回符合條件的數(shù)據(jù)。通常情況下,索引可以被創(chuàng)建在表的主鍵列、唯一約束列、普通列上,其中主鍵和唯一約束列上的索引是最常用的。
使用索引可以有效地加快查詢操作的速度,但也會增加寫操作的開銷。因此,在創(chuàng)建索引時需要根據(jù)實際情況進行權(quán)衡考慮。
MySQL索引的作用
1.提高查詢速度:索引可以加速MySQL數(shù)據(jù)庫執(zhí)行SELECT查詢語句的速度。MySQL在查詢時可以利用索引直接定位到所需的數(shù)據(jù)行,而不必遍歷整個數(shù)據(jù)表。
2.保證數(shù)據(jù)的唯一性:在MySQL數(shù)據(jù)庫中,主鍵或唯一約束列上的索引能夠保證數(shù)據(jù)的唯一性,避免重復(fù)數(shù)據(jù)的出現(xiàn)。
3.提高排序速度:當對某一個列進行ORDER BY操作時,MySQL可以利用索引進行快速排序,避免在內(nèi)存中執(zhí)行排序操作所造成的效率低下。
4.加速數(shù)據(jù)表的連接:當數(shù)據(jù)表之間進行JOIN操作時,MySQL可以利用索引快速定位所需數(shù)據(jù),并將其連接成需要的結(jié)果。
MySQL索引適合在哪些場景下使用
因為MySQL索引雖然提高了查詢的效率,但是也需要付出一定的代價。
1.需要付出額外的空間代價來保存索引數(shù)據(jù)
2.索引可能會拖慢新增、刪除、修改的速度
MySQL索引通常在一下場景下使用:
1.經(jīng)常查詢的列:如果一個列經(jīng)常被用于 SELECT 或 WHERE,那么它應(yīng)該被索引。這種情況下,索引可以大大提高查詢的性能。
2.唯一性列:主鍵、唯一性約束條件和外鍵都應(yīng)該創(chuàng)建索引,這可以確保數(shù)據(jù)表的數(shù)據(jù)唯一性,并保證數(shù)據(jù)表間連接的性能。
3.經(jīng)常連接的表:如果兩個或多個表經(jīng)常出現(xiàn)在 JOIN 語句中,那么創(chuàng)建這些表之間連接所需的列上的索引,可以大大提高查詢的性能。
4.經(jīng)常排序的列: 如果一個數(shù)據(jù)表中的某個列經(jīng)常出現(xiàn)在 ORDER BY 子句中,那么索引可以大大提高排序操作的速度。
5.經(jīng)常分組的列: 如果一個數(shù)據(jù)表中的某個列經(jīng)常用于聚合操作(如SUM、COUNT、AVG等),那么索引可以大大提高聚合操作的性能。
如何使用MySQL索引
查看索引
show index from 表名
每一列所表示的含義:
Table:索引所屬的數(shù)據(jù)表名。
Non_unique:這個索引是否是唯一索引。如果值為0,表示是唯一索引;如果值為1,表示非唯一索引。
Key_name:索引的名稱。
Seq_in_index:索引中字段的位置。索引可以涉及到多個字段,這個字段標識了當前字段在索引中的位置。
Column_name:索引所在的列名。
Collation:索引的字符集。
Cardinality:索引中的唯一值的數(shù)量。
Sub_part:索引使用的列的前綴長度。
Packed:索引是否使用壓縮。
Null:索引是否可以插入空值。
Index_type:索引的類型,可能是BTREE、HASH、FULLTEXT等。
Comment:關(guān)于索引的一些注釋信息。
創(chuàng)建索引
create index 索引名 on 表名(列名);
查看表結(jié)構(gòu)
desc student;
創(chuàng)建索引并查看
create index index_sn on student(sn);
show index from student;
刪除索引
drop index 索引名 on 表名
drop index index_sn on student;
show index from student;
MySQL索引的底層結(jié)構(gòu)
MySQL索引的底層結(jié)構(gòu)不是二叉搜索樹和哈希表,而是B+樹。說到B+樹,大家可能都知道還有一個B樹,B+樹是在B樹的基礎(chǔ)上發(fā)展來的。
B樹
??B樹是一種多路查找樹,用于在大小可變的文件中進行查找和排序。B樹通常被用來實現(xiàn)數(shù)據(jù)庫或文件系統(tǒng)中的數(shù)據(jù)結(jié)構(gòu),它具有平衡讀寫性能、支持數(shù)據(jù)的動態(tài)更新和查詢復(fù)雜度低等優(yōu)點。
??B樹的基本思想是將關(guān)鍵字和數(shù)據(jù)元素按序存儲在樹的結(jié)點中,并按特定規(guī)則組織樹形結(jié)構(gòu)。B樹的每個結(jié)點最多可以有m個子樹,若結(jié)點中存儲的關(guān)鍵字數(shù)為n,那么該結(jié)點中應(yīng)有n+1個指向子樹的指針。B樹的關(guān)鍵字按大小順序排列,且結(jié)點中所有關(guān)鍵字不重復(fù)。
下面就是一個簡單的B樹
B樹的特點:
1.B樹可以高效地支持多路查找。通過對結(jié)點進行平衡,B樹的查找性能穩(wěn)定,在最壞情況下僅需要O(log n)的時間復(fù)雜度即可在樹結(jié)構(gòu)中查找到一個關(guān)鍵字。
2.B樹可以高效地支持數(shù)據(jù)的動態(tài)更新和平衡。通過在插入和刪除操作中對樹的平衡進行自我調(diào)整,B樹能夠高效地對數(shù)據(jù)的動態(tài)更新進行處理。
3.B樹的每個結(jié)點可以存儲更多的關(guān)鍵字和數(shù)據(jù)元素,進而減少磁盤I/O的次數(shù),提高整體的查找和排序性能。
B+樹
B+樹是一種多路查找樹,是B樹的一種變種。B+樹與B樹的主要區(qū)別是:B+樹的非葉子結(jié)點只包含導(dǎo)航信息,不包含實際數(shù)據(jù);B+樹的關(guān)鍵字只出現(xiàn)在葉子結(jié)點中,而且葉子結(jié)點本身按關(guān)鍵字大小順序存儲,且相鄰葉子結(jié)點通過指針連接。
??B+樹的特點:
1.B+樹的非葉子結(jié)點不存儲數(shù)據(jù),只存儲導(dǎo)航信息。這種設(shè)計可以使得B+樹的內(nèi)部結(jié)構(gòu)更加緊湊,從而減少樹的高度,提高查詢效率。
2.B+樹的所有葉子結(jié)點都包含了相同的信息,因此可以很方便地實現(xiàn)區(qū)間查找或范圍查找。這種設(shè)計也提高了B+樹的查詢性能。
3.類似B樹,B+樹也是平衡樹,每個節(jié)點內(nèi)部都包含多個關(guān)鍵字,能夠有效支持多值查找和排序。
4.B+樹的葉子結(jié)點之間可以用指針串接起來,形成一個有序鏈表,因此可以支持快速的區(qū)間遍歷和排序數(shù)據(jù)。
??B+樹的優(yōu)勢:
1.更快的查找性能:B+樹在非葉子節(jié)點只存儲索引信息,數(shù)據(jù)都存放在葉子節(jié)點中。當進行查找時,只需要從根節(jié)點開始往下遍歷,每個非葉子節(jié)點只需要加載一次就能定位到數(shù)據(jù)所在的葉子節(jié)點,從而大大提高了查詢效率。
2.更高的穩(wěn)定性:B+樹的非葉子節(jié)點只存儲索引,而數(shù)據(jù)都存放在葉子節(jié)點中。當葉子節(jié)點變化時,只會對葉子節(jié)點進行操作,而非葉子節(jié)點不會改變,這種特性大大增加了數(shù)據(jù)結(jié)構(gòu)的穩(wěn)定性,減少了出錯率。
3.適應(yīng)范圍更廣:B+樹能夠適應(yīng)更廣范圍的磁盤IO操作,因為B+樹的葉子節(jié)點都是通過鏈表相互連接的,能夠更加快速地支持區(qū)間查找和遍歷操作,適用于海量數(shù)據(jù)存儲和查詢場景。
4.更高的順序訪問性能:由于B+樹的葉子節(jié)點是按順序進行存儲的,因此能夠更加快速地進行順序遍歷操作,特別是在需要頻繁進行范圍查詢操作的場景,能夠極大地提升性能。文章來源:http://www.zghlxwxcb.cn/news/detail-493079.html
注意
當表中存在一個主鍵索引時,如果還存在另一個索引,那么還是以主鍵索引為主構(gòu)建B+樹,葉子節(jié)點組織所有的數(shù)據(jù)行,而另一個非主鍵索引也會額外構(gòu)架一個B+樹,但是這個 B+ 樹的葉子節(jié)點就不再存儲這一行的完整數(shù)據(jù),而是存主鍵的索引,還需要通過主鍵 索引 去主鍵的 B+ 樹里再查一次(查兩次 B+ 樹),這個過程被稱為回表文章來源地址http://www.zghlxwxcb.cn/news/detail-493079.html
到了這里,關(guān)于MySQL索引:讓你的數(shù)據(jù)庫查詢快到起飛!的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!