索引的作用
索引的作用就是加快查詢速度,如果把使用了索引的查詢看做是法拉利跑車的話,那麼沒有用索引的查詢就相當於是自行車。目前實際專案中表的資料量越來越大,動輒上百萬上千萬級別,沒有索引的查詢會變得非常緩慢,使用索引成為了查詢優化的必選專案。
索引的概念
索引其實是一種特殊的資料,也儲存在資料庫檔案中,索引資料儲存著資料表中實際資料的位置。類似書籍前面的目錄,這個目錄就儲存了書中各個章節的頁數,通過檢視目錄我們可以快速定位章節的頁數,從而加快查詢速度。
我們來看一段查詢語句:
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)經常需要增刪改的字段
什麼情況下索引會失效?
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是一種比較高效的搜尋結構。
總結索引是提高查詢速度的重要手段,本章我們學習了索引的分類和建立語法,以及使用索引的策略,不是所有的表都適合建立索引,最後我們還學習了索引的內部結構,這樣大家對索引會有乙個基本的認識。
SQL語言之查詢
sql語言之查詢 二 前言本章我們將學習sql查詢中的高階部分,如內連線 外連線和子查詢,通過這些查詢技術我們將能夠解決專案中複雜的查詢問題。外來鍵約束 mysql屬於關係型的資料庫,表之間可以建立關係,如 學生表和成績表,在成績表中新增學生編號引用學生表中的學生編號,這樣在成績表中就不用新增重複的...
SQL語言之資料定義語言(Oracle)
一 建立表 create table 例 如上圖建立表 create table dept deptno number 2 dname varchar2 14 loc varchar2 13 oracle資料庫中的表 1.使用者表由使用者建立和維護的表的集合 包含使用者資訊 2.資料字典 由orac...
SQL語言之運算元據(Oracle)
當新增 更改或者刪除資料庫中的資料時需要使用dml語句。dml依據的乙個集合構成了乙個被稱之為事務的邏輯單元 當完成以下操作是,dml語句被執行 新增新的行到表中 修改表中的行 刪除表中的行 一 新增乙個新行到表中 insert語法 每次只能插入一行 指定列新增 以hr使用者中的department...