好程序員Java分享SQL語言之索引,前言:本章咱們將學習MySQL中的索引,本文將從索引的做用、索引的分類、建立索引的語法、索引的使用策略以及索引的實現原理等方面帶你們瞭解索引。
索引的做用
索引的做用就是加快查詢速度,若是把使用了索引的查詢看作是法拉利跑車的話,那麼沒有用索引的查詢就至關因而自行車。目前實際項目中表的數據量愈來愈大,動輒上百萬上千萬級別,沒有索引的查詢會變得很是緩慢,使用索引成爲了查詢優化的必選項目。程序員
索引的概念
索引實際上是一種特殊的數據,也保存在數據庫文件中,索引數據保存着數據表中實際數據的位置。相似書籍前面的目錄,這個目錄就保存了書中各個章節的頁數,經過查看目錄咱們能夠快速定位章節的頁數,從而加快查找速度。
咱們來看一段查詢語句:
select * from book where id = 1000000;
假設書籍表中有幾百萬行數據,沒索引的查詢會遍歷前面的100萬行數據找到結果,若是咱們在id上創建主鍵索引,則直接在索引上定位結果,速度要快得多。數據庫
索引的優缺點
優勢:提升查詢速度
缺點:自己也是數據,會佔用磁盤空間;索引的建立和維護也須要時間成本;進行刪除、更新和插入操做時,由於要維護索引,因此速度會下降。數據結構
使用索引的語法
建立索引
建表的同時建立索引
create table 表名
(
字段名 類型,
...
字段名 類型,
index 索引名稱 (字段名)
);
建表後添加索引
alter table 表名 add index 索引名(字段名);
或
create index 索引名 on 表名(字段名);
刪除索引
alter table 表名 drop index 索引名;
或
drop index 索引名 on 表名;
查看錶中的索引
show index from 表名;
查看查詢語句使用的索引
explain 查詢語句;函數
索引的分類
索引按功能分爲:
普通索引,在普通字段上創建的索引,沒有任何限制
主鍵索引,建立主鍵時,自動建立的索引,不能爲空,不能重複
惟一索引,創建索引的字段數據必須是惟一的,容許空值
全文索引,在大文本類型(Text)字段上創建的索引
組合索引,組合多個列建立的索引,多個列不能有空值
代碼示例:
-- 建立書籍表
create table tb_book
(學習
-- 建立主鍵索引 id int primary key, -- 建立惟一索引 title varchar(100) unique, author varchar(20), content Text, time datetime, -- 普通索引 index ix_title (title), -- 全文索引 fulltext index ix_content(content), -- 組合索引 index ix_title_author(title,author)
);
-- 建表後添加主鍵索引
ALTER TABLE tb_book ADD PRIMARY KEY pk_id(id);
-- 建表後添加惟一索引
ALTER TABLE tb_book ADD UNIQUE index ix_title(title);
-- 建表後添加全文索引
ALTER TABLE tb_book ADD FULLTEXT index ix_content(content);
-- 查詢時使用全文索引
SELECT * FROM tb_book MATCH(content) ANGAINST(‘勝利’);
-- 建表後添加組合索引
ALTER TABLE tb_book ADD INDEX ix_book(title,author);
注意:建立組合索引時,要遵循」最左前綴」原則,把最常查詢、排序的字段放左邊,按重要性依次遞減。優化
索引的使用策略
什麼狀況下要創建索引?
1)在常常須要查詢和排序的字段上創建索引
2)數據特別多
什麼狀況下不要創建索引?
1)字段數據存在大量的重複,如:性別
2)數據不多
3)常常須要增刪改的字段spa
什麼狀況下索引會失效?
1)模糊查詢時,使用like ‘%張%’會失效,而like ‘張%’不會
2)使用is null或is not null查詢時
3)使用組合索引時,某個字段爲null
4)使用or查詢多個條件時
5)在函數中使用字段時,如where year(time) = 2019
索引的結構
不一樣的存儲引擎使用不一樣結構的索引:
聚簇索引,InnoDB支持,索引的順序和數據的物理順序一致,相似新華字典中的拼音目錄排列和漢字排列順序一致,聚簇索引一個表中只能有一個。
非聚簇索引,MyISAM支持,索引順序和數據的物理順序不一致,相似新華字典中的偏旁部首目錄和漢字排列順序不一致,非聚簇索引表能夠有多個。
指針
索引的數據結構主要是:BTree和B+Tree
BTree的數據結構以下,是一種平衡搜索多叉樹,每一個節點由key和data組成,key是索引的鍵,data是鍵對應的數據,在節點的兩邊是兩個指針,指向另外的索引位置,而全部的鍵都是排序過的,這樣在搜索索引時,能夠使用二分查找,速度比較快,時間複雜度是h*log(n),h是樹的高度,BTree是一種比較高效的搜索結構。
code
B+Tree的數據結構以下,是BTree的升級版,區別是非葉子節點不在存儲具體的數據,只保存索引的鍵,數據保存到葉子節點中,而且葉子節點中沒有指針只有鍵和數據。B+Tree的優勢是:搜索效率更高,由於非葉子節點中沒有保存數據,就能夠保存更多的鍵,每一層的鍵越多,樹的高度就會減小,這樣查詢速度就會提高。
排序
總結索引是提升查詢速度的重要手段,本章咱們學習了索引的分類和建立語法,以及使用索引的策略,不是全部的表都適合建立索引,最後咱們還學習了索引的內部結構,這樣你們對索引會有一個基本的認識。