一分鐘了解索引技巧

2021-08-03 15:26:23 字數 1614 閱讀 1955

花1分鐘時間,了解聚集索引,非聚集索引,聯合索引,索引覆蓋。

舉例,業務場景,使用者表,表結構為:

t_user(

uid primary key,

login_name unique,

passwd,

login_time,

age, …

);

聚集索引(clustered index)

:聚集索引決定資料在磁碟上的物理排序,乙個表只能有乙個聚集索引,一般用primary key來約束。 舉例

:t_user場景中,

uid上的索引。

非聚集索引(non-clustered index)

:它並不決定資料在磁碟上的物理排序,

索引上只包含被建立索引的資料,以及乙個行定位符row-locator

,這個行定位符,可以理解為乙個聚集索引物理排序的指標,通過這個指標,可以找到行資料。 舉例

,查詢年輕mm的業務需求:

select uid from t_user where age > 18 and age < 26;

age上建立的索引,就是非聚集索引。

聯合索引

:多個欄位上建立的索引,能夠加速複核查詢條件的檢索 舉例

,登入業務需求:

select uid, login_time from t_user where 

login_name=? and passwd=?

可以建立(login_name, passwd)的聯合索引。

聯合索引能夠滿足最左側查詢需求

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

這也就是為何

不建立(passwd, login_name)這樣聯合索引

的原因,業務上幾乎沒有passwd的單條件查詢需求,而有很多login_name的單條件查詢需求。 提問

: select uid, login_time from t_user where

passwd=? and login_name=?

能否命中(login_name, passwd)這個聯合索引?

回答:可以,

最左側查詢需求,並

不是指sql語句的寫法必須滿足索引的順序

(這是很多朋友的誤解)

索引覆蓋

:被查詢的列,資料能從索引中取得,而不用通過行定位符row-locator再到row上獲取,即「被查詢列要被所建的索引覆蓋」,這能夠加速查詢速度。

舉例,登入業務需求:

select uid, login_time from t_user where

login_name=? and passwd=?

可以建立

(login_name, passwd, login_time)的聯合索引

,由於login_time已經建立在索引中了,被查詢的uid和login_time就不用去row上獲取資料了,從而加速查詢。

末了多說一句,登入這個業務場景,login_name具備唯一性,建這個單列索引就好。 作業

:假設訂單有三種狀態:

0已下單,

1已支付,

2已完成

業務需求,查詢未完成的訂單,哪個sql更快呢?

一分鐘sed入門(一分鐘系列)

1.簡介 sed是一種行編輯器,它一次處理一行內容。2.sed呼叫方式 sed options command file s sed options f scriptfile file s 第一種直接在命令列中執行,第二種把命令寫到了指令碼中,二者無本質區別。示例 1 列印hello.txt的內容 ...

一分鐘了解負載均衡

什麼是負載均衡 負載均衡 load balance 是分布式系統架構設計中必須考慮的因素之一,它通常是指,將請求 資料 均勻 分攤到多個操作單元上執行,負載均衡的關鍵在於 均勻 常見的負載均衡方案 常見網際網路分布式架構如上,分為客戶端層 反向 nginx層 站點層 服務層 資料層。可以看到,每乙個...

一分鐘了解 TCP IP 模型

原文講的不是特別細,為了便於理解,我顛倒了順序。寫在開始我們需要知道協議到底是什麼。在網路上,乙個協議對應於管理系統之間如何相互通訊的規則。然後我們需要知道什麼是協議族。乙個協議族是一系列協同工作的協議的集合。什麼是 tcp ip 模型?tcp ip 傳輸控制協議 網際網路協議 由 darpa 在 ...