通過例項理解單列索引 多列索引以及最左字首原則

2022-08-19 11:18:11 字數 1240 閱讀 6012

我們想查出滿足以下條件的使用者id: 

select uid from people where lname =

'liu

'and fname=

'zhiqun

'and age=

26;

因為我們不想掃瞄整表,故考慮用索引。

alter

table people add

index lname (lname);

將lname列建索引,這樣就把範圍限制在lname='liu'的結果集1上,之後掃瞄結果集1,產生滿足fname=』zhiqun』的結果集2,再掃瞄結果集2,找到 age=26的結果集3,即最終結果。

由於建立了lname列的索引,與執行表的完全掃瞄相比,效率提高了很多,但我們要求掃瞄的記錄數量仍舊遠遠超過了實際所需要的。雖然我們可以刪除lname列上的索引,再建立fname或者age 列的索引,但是,不論在哪個列上建立索引搜尋效率仍舊相似。

alter

table people add

index lname_fname_age (lame,fname,age);

為了提高搜尋效率,我們需要考慮運用多列索引,由於索引檔案以b-tree格式儲存,所以我們不用掃瞄任何記錄,即可得到最終結果。

在mysql中執行查詢時,只能使用乙個索引,如果我們在lname,fname,age上分別建索引,執行查詢時,只能使用乙個索引,mysql會選擇乙個最嚴格(獲得結果集記錄數最少)的索引。

最左字首:顧名思義,就是最左優先,上例中我們建立了lname_fname_age多列索引,相當於建立了(lname)單列索引,(lname,fname)組合索引以及(lname,fname,age)組合索引。

注:在建立多列索引時,要根據業務需求,where子句中使用最頻繁的一列放在最左邊。

1、最左字首匹配原則,mysql會一直向右匹配直到遇到範圍查詢(>、<、between、like)就停止匹配,比如a = 1 and b = 2 and c > 3 and d = 4 如果建立(a,b,c,d)順序的索引,d是用不到索引的,如果建立(a,b,d,c)的索引則都可以用到,a,b,d的順序可以任意調整。

2、=和in可以亂序,比如a = 1 and b = 2 and c = 3 建立(a,b,c)索引可以任意順序,mysql的查詢優化器會幫你優化成索引可以識別的形式

3、因為最左優先的原則,所以在建立多列索引時,要根據業務需求,where子句中使用最頻繁的一列放在最左邊。

MySQL單列索引和多列索引

在設計mysql表索引的時候,可能有個問題,就是多個單列索引好,還是設計為多列索引好 下面從不同角度分析下這個問題 1.多個單列索引 定義 即是在表中在需要索引的字段上為每個字段設計乙個索引 特點 簡單,索引個數多 2.多列索引 定義 即是在表中根據查詢需求在多個欄位上設計乙個索引 特點 稍微複雜,...

mysql 單列索引與多列索引

以下的文章主要介紹的是mysql資料庫索引型別,其中包括普通索引,唯一索引,主鍵索引與主鍵索引,以及對這些索引的實際應用或是建立有乙個詳細介紹,以下就是文章的主要內容描述。1 普通索引 這是最基本的mysql資料庫索引,它沒有任何限制。它有以下幾種建立方式 建立索引 create index ind...

mysql單列索引 多列索引的使用

資料庫的索引可以加快查詢速度,原因是索引使用特定的資料結構 b tree 對特定的列額外組織存放,加快儲存引擎 索引是儲存引擎實現 查詢記錄的速度。索引優化是資料庫優化的最重要手段。如果查詢語句使用索引 通常是where條件匹配索引 就會利用樹的結構加快查詢,索引會按值查詢到要查詢的行在表中位置,不...