【MySQL】回表 索引下推

一、回表

衆所周知使用innodb的表可以存在多個二級索引,但只能有一個主鍵索引。這聚集索引滿足下列要求:

  • 當存在主鍵,索引值就是主鍵
  • 當主鍵不存在,但存在唯一索引,那麼索引值就是該唯一索引
  • 當既不存在主鍵,也不存在唯一索引,那麼就自動生成rowid所謂索引值

主鍵索引索引值存儲在b+樹的葉子節點上,同時他還帶着對應的行數據。
而二級索引索引值帶的數據則是主鍵索引的索引值。
假設你的主鍵索引值是自增的id,你還設了了一個二級索引,並通過sql語句使用該二級索引查詢,此時MySQL會在該索引上查詢得到主鍵id,然後再通過主鍵id去查詢,這就叫做回表。

二、索引下推

回表有什麼壞處呢?
回表會增加查詢的步驟、降低查詢效率,試想你創建了一個(name,age)的二級索引。當你通過name和age查詢時,會先在二級索引上根據name得到主鍵並回表,回表後還要在主鍵索引上查詢age。

可以發現回表直接導致了二級索引上的age沒有被使用到,當使用索引下推後就不存在這種情況了。MySQL是默認開啓索引下推的。手動開關代碼如下:

set optimizer_switch='index_condition_pushdown=off'
set optimizer_switch='index_condition_pushdown=on'

使用索引下推後會優先在索引上進行查詢過濾,使用explain查詢會發現:

  • 當Extra的值爲Using index condition; 說明你查詢的字段全部在索引上完成了過濾操作,回表時會根據主鍵直接得到對應的行數據。
  • 當Extra的值爲Using where時,可能你的查詢字段沒有設置索引,這時會直接在主鍵索引上查詢,效率低下。
  • 當Extra的值爲Using index condition; Using where時,說明你查詢的一部分部分字段有索引,另一部分沒有索引,當有索引的字段完成查詢時回表,並不會立馬返回數據,而是還要再全表查詢那些沒有索引的字段。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章