首先,資料庫中的索引是什麼?
引用高效能mysql中的一句話:索引(mysql也叫作鍵(key))是儲存引擎用於快速找到記錄的一種資料結構。
這句話有兩個點:儲存引擎和資料結構。首先理解索引是在儲存引擎層而非伺服器層實現。而mysql分為多種儲存引擎,這裡我們只探討myisam 和InnoDB。兩者都支援B+Tree(一種資料結構)索引。
如果說這個理解不了,還有一個通俗易懂的方法。書都有目錄,快速找到自己需要內容的方法,就是檢視目錄,索引就是資料庫表資料的目錄。
迴歸問題:索引引發的回表問題。索引為啥會引發回表?
下面我們來假設一種情況,一個表有三個欄位 ID ,name ,age,將ID設定成主鍵索引,name設成輔助索引。
然後來看一下下面的sql:
1.select * from t where;
2.select * from t where name="張三";
兩個很簡單的Sql。
第一個sql不用說,直接透過主鍵索引,從樹上直接可以得到結果。
第二個sql:首先name,mysql並不能得到所有列的資訊(也就是*),只能得到主鍵ID,然後會根據ID在進行二次查詢,這就引發了回表問題。這就是為啥不能使用*的原因。
那麼怎麼解決呢?
第一不要寫*。
第二利用組合索引,也就是說你根據業務實際需要,將需要的欄位形成組合索引。
首先,資料庫中的索引是什麼?
引用高效能mysql中的一句話:索引(mysql也叫作鍵(key))是儲存引擎用於快速找到記錄的一種資料結構。
這句話有兩個點:儲存引擎和資料結構。首先理解索引是在儲存引擎層而非伺服器層實現。而mysql分為多種儲存引擎,這裡我們只探討myisam 和InnoDB。兩者都支援B+Tree(一種資料結構)索引。
如果說這個理解不了,還有一個通俗易懂的方法。書都有目錄,快速找到自己需要內容的方法,就是檢視目錄,索引就是資料庫表資料的目錄。
迴歸問題:索引引發的回表問題。索引為啥會引發回表?
下面我們來假設一種情況,一個表有三個欄位 ID ,name ,age,將ID設定成主鍵索引,name設成輔助索引。
然後來看一下下面的sql:
1.select * from t where;
2.select * from t where name="張三";
兩個很簡單的Sql。
第一個sql不用說,直接透過主鍵索引,從樹上直接可以得到結果。
第二個sql:首先name,mysql並不能得到所有列的資訊(也就是*),只能得到主鍵ID,然後會根據ID在進行二次查詢,這就引發了回表問題。這就是為啥不能使用*的原因。
那麼怎麼解決呢?
第一不要寫*。
第二利用組合索引,也就是說你根據業務實際需要,將需要的欄位形成組合索引。