聚集索引、非聚集索引、聯合索引、索引覆蓋


1.例子

用戶表,表結構如下:

t_user {

  uid primary key,

  login_name unique,

  passwd,

  login_time,

  age,

...

};

2. 聚集索引(clustered index)

聚集索引決定數據在磁盤上的物理排序,一個表只能有一個聚集索引,一般用primary key來約束。

舉例:t_user表里面的uid上的索引是聚集索引。

3. 非聚集索引(non-clustered index)

它並不決定數據在磁盤上的物理排序,索引上只包含被建立索引的數據,以及一個行定位符row-locator,這個行定位符,可以理解為一個聚集索引物理排序的指針,通過這個指針,可以找到行數據。

舉例:select uid from t_user where age > 18 and age < 26;age上建立的索引,就是非聚集索引。

4. 聯合索引

多個字段上建立的索引,能夠加速復合查詢條件的檢索

舉例:select uid,login_time from t_user where login_time=? and passwd=?;可以建立(login_name, passwd)的聯合索引。

聯合索引能夠滿足最左側查詢需求,例如(a,b,c)三列的聯合索引,能夠加速a|(a,b)|(a,b,c)三組查詢需求。

這也就是為何不建立(passwd,login_time)這樣聯合索引的原因,業務上幾乎沒有passwd的單條件查詢需求,而有很多login_name的單條件查詢需求。

select uid, login_time from t_user where passwd=? and login_name=?

能否命中(login_time,passwd)這個聯合索引。

可以,最左側查詢需求,並不是指SQL語句的寫法必須滿足索引的順序。

5. 索引覆蓋

被查詢的列,數據能從索引中取得,而不是通過行定位符row-locator再到row上獲取,即“被查詢列要被所建的索引覆蓋”,這能夠加速查詢速度。

select uid, login_time from t_user where login_time=? and passwd=?

可以建立(login_name,passwd,login_time)的聯合索引,由於login_time已經建立在索引中了,被查詢的uid和login_time就不用去row上獲取數據了,從而加速查詢。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM