索引是關系型數據庫給數據庫表中一列或多列的值排序后的存儲結構。SQL的主流存儲結構是B+樹以及Hash結構,聚集索引和非聚集索引用的是B+樹索引。
mysql索引:唯一索引,主鍵(聚集)索引,非聚集索引,全文索引
聚集索引
聚集(clustered)索引也叫聚簇索引
聚集索引:數據行的物理順序與列值(一般是主鍵的那一列)的邏輯行順序相同,一個表中只能擁有一個聚集索引
創建聚集索引:
如果不創建索引,系統會自動創建一個隱含列作為表的聚集索引
1,創建表的時候指定主鍵(mysql的主鍵就是聚集索引)
create table t1 (
id int primary key,
name char(30)
)
2,創建表后創建聚集索引
alter table tb_name add primary key(id); //Mysql
最好在創建表的時候創建聚集索引(主鍵),由於聚集索引的物理順序上的特性,因此如果在在上面創建索引時,會根據索引列的排序移動全部數據行上面的順序,會非常耗費時間和性能
非聚集索引
非聚集索引:該索引中索引的邏輯順序與磁盤上的物理存儲順序不同,一個表可以擁有多個非聚集索引
按照定義:其實除了聚集索引(即主鍵)其他的索引都是非聚集索引。為了划分更細,分為了 普通索引、全文索引、唯一索引
非聚集索引的二次查詢問題:非聚集索引葉節點仍然是索引節點,只是有一個指針指向對應的數據塊,此如果使用非聚集索引查詢,而查詢列中包含了其他索引沒有覆蓋的列,那么他還要進行第二次查詢,查詢節點上對應數據行的數據
id值clustered(聚集索引即主鍵),username是非聚集索引
select id,username from t1 where username='小明'; //此查詢不需要進行二次查詢,直接可以從非聚集索引節點里面就可以獲取查詢列的數據
select id,username,score from t1 where username = '小明'; //此查詢就需要進行二次查詢去獲取原數據行的score
如何解決非聚集索引的二次查詢的問題
復合索引(覆蓋索引)
建立兩列以上的索引,即可查詢復合索引里的列的數據而不需要回表二次查詢,如index(col1,col2)
select col1,col2 from tb where col1 = '213'
要注意使用復合索引要符合最左側索引的原則,也就是查詢條件的時候如果where條件沒有最左側的一列到多列,索引就不會起作用。
1,使用聚集(主鍵)索引比非聚集索引效率高,如果需要頻繁改變聚集索引的值,寫入性能並不高,因為需要移動對應數據的物理位置
2,非聚集索引在查詢的時候可以的話就避免二次查詢,這樣性能會大幅提升
3,不是所有的表都適合創建索引,只有數據量大的表才適合創建索引,且建立在選擇性高的列上面性能會更好