索引是一種數據結構mysql
索引的特色:查找速度快,排好序,數據結構程序員
索引的數據結構類型有:BTREE索引和HASH索引,下面展現的是BTREE索引。sql
BTREE:balance tree (平衡樹)數據庫
BTREE的特色實例:數據結構
假設有一張表,表中的數據爲下圖中的左側,則索引中數據爲下圖中的右側:框架
若是查詢id爲9,name爲ii的,在表中須要查詢9次,可是在二叉樹中須要查詢3次。指針
1.彙集索引:節點就是數據自己,即索引表中存的就是數據自己cdn
2.非彙集索引:節點仍然是索引節點,只不過有指向對應數據塊的指針,上面所說的BTREE索引就是非彙集索引blog
彙集索引的速度比非彙集索引快。排序
1.單列索引(一個索引只包含一個列,一個表能夠有多個單列索引)
1-1.主鍵索引:primary key
建立主鍵索引,有兩種方式,其中t1和t2位表名,id爲列:
1)建表的時候建立:create table t1 (id int primary key);
2)經過alter語句:alter table t2 add primary key(id);
1-2.普通索引:index,最基本的索引
建立普通索引:
(1)create index 索引名 on 表(列),
例如: create index idx_id on t3(id);
(2)經過alter語句:alter table t4 add index(id);
1-3.惟一索引:unique
建立惟一索引:
(1)建表的時候建立:create table t5 (id int unique);
(2)create unique index 索引名 on 表(列),
例如:create unique index idx_id on t5(id);
注意:unique的字段能夠爲null,也能夠重複,「」不能夠重複出現。
1-4.全文索引:fulltext
數據庫自帶的全文索引,對中文支持不友好,能夠藉助第三方的框架,如:sphinx(斯芬克斯)、coreseek
2.多列索引(組合索引,一個組合索引包含兩個或兩個以上的列)
建立:create index idx_列名1_列名2 on 表名(列名1,列名2)
實例:
建表:create table student(id int,name varchar(20),address varchar(20),remark varchar(20));
建組合索引:create index idx_name_address_remark on student(name,address,remark);
查詢sql是否使用到了索引,可使用explain進行分析,後續會給出介紹。
在使用查詢的時候遵循mysql組合索引的「最左前綴」,where時的條件要按創建索引的時候字段的排序方式,下面都是基於多列索引講述的:
一、不按索引最左列開始查詢
(1) where address='深圳' 不會走索引
(2)where address = '深圳' and remark='程序員' 不會走索引
二、查詢中某個列有範圍查詢,則其右邊的全部列都沒法使用查詢(多列查詢)
where name='xbq' and address like '%深%' and remark='程序員' ,該查詢只會使用索引中的前兩列,由於like是範圍查詢
三、查詢中第一個索引字段出現like '%xxx%'或者'%xxx',不會走索引
4.查詢中多條件用or鏈接,此類型和1類似
那麼對於索引怎麼刪除呢?刪除索引:alter table 表名 drop index 索引名稱
查詢索引有兩種方式:
優勢:
1.能夠經過創建惟一索引或者主鍵索引,保證數據庫表中每一行數據的惟一性.
2.提升檢索速度,下降磁盤讀取IO
索引是排序好的,不須要進行全表掃描,下降了數據排序的運算成本,也就是下降了CPU的消耗
缺點:
1.索引也須要存儲,因此也須要空間,實際上索引也是一張表,保存了索引字段的值和指向實體表的指針
2.下降更新(增刪改)表的速度,更新不單單只是數據自己,若是數據正好是索引字段,同時須要更新索引信息
當索引字段對應的數據改變了,則索引表也會改變,例如,當圖書館中 的書櫃和書,書的類型爲科普類,書櫃上的目錄也是科普類,
當此書櫃中的書改變了位置的時候,則對應的書櫃的目錄表也要改變。
歡迎關注個人公衆號,第一時間接收最新文章~ 搜索公衆號: 碼咖 或者 掃描下方二維碼: