一、索引概述
1.1 索引的介紹
索引index:是幫助 Mysql?高效獲取數(shù)據(jù)?的?有序的數(shù)據(jù)結(jié)構(gòu),在數(shù)據(jù)之外,數(shù)據(jù)庫(kù)系統(tǒng)維護(hù)著的滿足特定查找算法的數(shù)據(jù)結(jié)構(gòu),這些數(shù)據(jù)結(jié)構(gòu)以某種方式引用(指向)數(shù)據(jù),這樣就可以在這些數(shù)據(jù)結(jié)構(gòu)上實(shí)現(xiàn)高級(jí)查找算法,這種數(shù)據(jù)結(jié)構(gòu)就是索引
1.2 索引的優(yōu)缺點(diǎn)
-
- 優(yōu)點(diǎn)1:提高數(shù)據(jù)檢索的效率,降低數(shù)據(jù)庫(kù)的IO成本
- 優(yōu)點(diǎn)2:通過索引列對(duì)數(shù)據(jù)進(jìn)行排序,降低數(shù)據(jù)排序的成本,降低CPU的消耗
- 缺點(diǎn)1:索引列也要占磁盤空間。
- 缺點(diǎn)2:索引大大提高了查詢效率,同時(shí)卻也降低了更新表的速度,如對(duì)表進(jìn)行insert,update,delete時(shí),效率降低
?文章來源:http://www.zghlxwxcb.cn/news/detail-607979.html
二、索引結(jié)構(gòu)
2.1 Mysql的索引常見結(jié)構(gòu)
Mysql的索引是在儲(chǔ)存引擎層實(shí)現(xiàn)的,不同的存儲(chǔ)引擎有不同的結(jié)構(gòu),主要包含一下幾種
-
- B+樹:最常見的索引類型,大部分引擎都支持B+樹索引
- Hash索引:底層數(shù)據(jù)結(jié)構(gòu)是用哈希表實(shí)現(xiàn)的,只有精確匹配索引的查詢才有效,不支持范圍查詢
?
2.2 Mysql常見索引對(duì)不同引擎的支持
-
- B+樹:InnoDB(支持)、MyISAM(支持)、Memory(支持)
- Hash索引:InnoDB(不支持)、MyISAM(不支持)、memory(支持)
?
2.3 二叉樹實(shí)現(xiàn)索引的弊端
說明1:實(shí)際中的索引是沒有使用二叉樹的,因?yàn)槎鏄渚哂幸幌碌谋锥恕 ?
說明2:當(dāng)順序插入時(shí),會(huì)形成一個(gè)鏈表,查詢性能大大降低,大數(shù)據(jù)量的情況下,層級(jí)較深,檢索速度慢。
說明3:特殊二叉樹紅黑樹當(dāng)做索引是,大數(shù)據(jù)量情況下,層級(jí)比較深,檢索速度慢
?
2.4 B樹實(shí)現(xiàn)索引的弊端
以一個(gè)最大度數(shù)(max-degree)為5(5階)的b樹為例(每個(gè)節(jié)點(diǎn)最多儲(chǔ)存4個(gè)key,5個(gè)指針)
說明:B樹的數(shù)據(jù)會(huì)存在每個(gè)節(jié)點(diǎn)上,而節(jié)點(diǎn)存在頁(2.6 Mysql索引對(duì)B+樹的優(yōu)化有說明)上面,每頁的大小為16K,這樣每個(gè)頁能存放的索引就比較少,導(dǎo)致同樣數(shù)據(jù)體積小,層級(jí)要比B+樹深。
?
2.5 B+樹實(shí)現(xiàn)索引
以一個(gè)最大度數(shù)(max-degree)為4(4階)的b+樹為例
?
說明:對(duì)比較與B樹
1、所有的數(shù)據(jù)都會(huì)出現(xiàn)在葉子節(jié)點(diǎn)上
2、葉子節(jié)點(diǎn)形成一個(gè)單向鏈表
2.6 Mysql索引對(duì)B+樹的優(yōu)化
Mysql索引數(shù)據(jù)結(jié)構(gòu)對(duì)經(jīng)典的B+樹進(jìn)行了優(yōu)化,在原來的B+樹基礎(chǔ)上,增加了一個(gè)指向相鄰葉子節(jié)點(diǎn)的鏈表指針,就行了帶有順序指針的B+樹,提高了區(qū)間訪問的性能
說明:每頁在InnoDB中默認(rèn)16K
2.7 hash索引
哈希索引就是采用一定的hash算法,將鍵值換成新的hash值,映射到對(duì)應(yīng)的槽位上,然后儲(chǔ)存在hash表中
說明:如果兩個(gè)(或者多個(gè))鍵映射到同一個(gè)槽位上,他們就產(chǎn)生了hash沖突,也稱hash碰撞,可以通過鏈表來解決
2.8 hash索引特點(diǎn)
-
- hash索引只能用于對(duì)等比較(=,in),不支持范圍查詢(between,>,<)
- 無法利用索引完成排序操作
- 查詢效率高,通常只需要一次檢索就可以了,效率通常要高于B+樹索引
- 在Mysql中,支持hash索引的事Memory引擎,而InnoDB中具有自適應(yīng)hash功能,hash索引是存儲(chǔ)引擎根據(jù)B+樹索引在指定條件下自動(dòng)構(gòu)建的
?
? 2.9 InnoDB引擎選擇B+樹的優(yōu)勢(shì)
-
- 相對(duì)于二叉樹,層級(jí)更少,搜索效率高
- 對(duì)于B樹,無論是葉子節(jié)點(diǎn)還是非葉子節(jié)點(diǎn),都會(huì)保存數(shù)據(jù),這樣導(dǎo)致一頁中存儲(chǔ)的鍵值減少,指針跟著減少,同樣保存大量數(shù)據(jù),只能增加樹的高度,導(dǎo)致性能降低。
- 相對(duì)于hash索引,B+樹支持范圍匹配及排序操作??
?
三、索引分類
3.1 主鍵索引
針對(duì)于表中主鍵創(chuàng)建的索引,默認(rèn)自動(dòng)創(chuàng)建,只能有一個(gè), 關(guān)鍵字:primary
3.2 唯一索引
避免同一個(gè)表中某數(shù)據(jù)列中的值重復(fù),可以有多個(gè),關(guān)鍵字:unique
3.3 常規(guī)索引
快速定位特定數(shù)據(jù),可以有多個(gè),
3.4 全文索引
全文索引查找的是文本中的關(guān)鍵字,而不是比較索引中的值,可以有多個(gè),fulltext
3.5 聚集索引
在InnoDB中,根據(jù)索引的儲(chǔ)存形式劃分的,將數(shù)據(jù)儲(chǔ)存與索引放到一起,索引結(jié)構(gòu)的葉子節(jié)點(diǎn)保存了行數(shù)據(jù),必須有,而且只有一個(gè)
-
- 如果存在主鍵,主鍵索引就是聚集索引
- 如果不存在主鍵,將使用第一個(gè)唯一(unique)索引作為聚集索引
- 如果表沒有主鍵,也沒有合適的唯一索引,則InnoDB會(huì)自動(dòng)生成一個(gè)rowid作為隱藏的聚集索引
3.6 二級(jí)索引
在InnoDB中,根據(jù)索引的儲(chǔ)存形式劃分的,將數(shù)據(jù)與索引分開儲(chǔ)存,索引結(jié)構(gòu)的葉子節(jié)點(diǎn)關(guān)聯(lián)的是對(duì)應(yīng)的主鍵,可以存在多個(gè)
? 說明:聚集索引下面存放的是整行的數(shù)據(jù),二級(jí)索引下面存放的對(duì)應(yīng)的主鍵,要不然聚集索引下存放了整行數(shù)據(jù),二級(jí)索引下也放整行數(shù)據(jù),就會(huì)很冗余
3.7 回表查詢
說明1:首先根據(jù)name字段走二級(jí)索引
說明2:找到Arm對(duì)應(yīng)的id=10
說明3:然后再根據(jù)id=10找到對(duì)應(yīng)的數(shù)據(jù)
說明4:整個(gè)過程也叫做回表查詢
?
四、索引語法
4.1 查看索引
show index from 表名
示例:
mysql> show index from account; +---------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+---------+------------+ | Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment | Visible | Expression | +---------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+---------+------------+ | account | 0 | PRIMARY | 1 | id | A | 4 | NULL | NULL | | BTREE | | | YES | NULL | +---------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+---------+------------+ 1 row in set (0.00 sec)
說明:account 有一個(gè)主鍵索引
4.2 創(chuàng)建索引
create [unique | fulltext] index 索引名 on 表名(索引的列名, ..);
說明1:如果創(chuàng)建索引的字段是唯一的,值都不重復(fù),可以加unique約束,說明這是一個(gè)唯一字段索引
說明2:fulltext 是全文檢索索引,主要針對(duì)大的文本字段
mysql> create index name_idx on account(name); Query OK, 0 rows affected (0.03 sec) Records: 0 Duplicates: 0 Warnings: 0 mysql> show index from account; +---------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+---------+------------+ | Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment | Visible | Expression | +---------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+---------+------------+ | account | 0 | PRIMARY | 1 | id | A | 4 | NULL | NULL | | BTREE | | | YES | NULL | | account | 1 | name_idx | 1 | name | A | 4 | NULL | NULL | YES | BTREE | | | YES | NULL | +---------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+---------+------------+ 2 rows in set (0.01 sec)
說明1:這就創(chuàng)建了一個(gè)名為name_idx的索引
4.3 刪除索引
drop index 索引名 on 表名
示例
mysql> drop index name_idx on account; Query OK, 0 rows affected (0.00 sec) Records: 0 Duplicates: 0 Warnings: 0 mysql> show index from account; +---------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+---------+------------+ | Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment | Visible | Expression | +---------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+---------+------------+ | account | 0 | PRIMARY | 1 | id | A | 4 | NULL | NULL | | BTREE | | | YES | NULL | +---------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+---------+------------+ 1 row in set (0.00 sec)
說明:這就刪除了一個(gè)索引
?
五、預(yù)告
后面的文章會(huì)繼續(xù)介紹索引的使用和設(shè)計(jì)原則文章來源地址http://www.zghlxwxcb.cn/news/detail-607979.html
到了這里,關(guān)于Mysql高級(jí)3-索引的結(jié)構(gòu)和分類的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!