到底什麼情況下mysql innodb會發生回表操作

時間 2021-06-07 10:50:12

1樓:零五

MySQL innodb的主鍵索引是簇集索引,也就是索引的葉子節點存的是整個單條記錄的所有字段值,不是主鍵索引的就是非簇集索引,非簇集索引的葉子節點存的是主鍵欄位的值。回表是什麼意思?就是你執行一條sql語句,需要從兩個b+索引中去取資料。

舉個例子:

表tbl有a,b,c三個字段,其中a是主鍵,b上建了索引,然後編寫sql語句

SELECT * FROM tbl WHERE a=1

這樣不會產生回表,因為所有的資料在a的索引樹中均能找到

SELECT * FROM tbl WHERE b=1

這樣就會產生回表,因為where條件是b欄位,那麼會去b的索引樹里查詢資料,但b的索引裡面只有a,b兩個欄位的值,沒有c,那麼這個查詢為了取到c欄位,就要取出主鍵a的值,然後去a的索引樹去找c欄位的資料。查了兩個索引樹,這就叫回表。

索引覆蓋就是查這個索引能查到你所需要的所有資料,不需要去另外的資料結構去查。其實就是不用回表。

怎麼避免?不是必須的字段就不要出現在SELECT裡面。或者b,c建聯合索引。但具體情況要具體分析,索引欄位多了,儲存和插入資料時的消耗會更大。這是個平衡問題。

什麼情況下1 1 1?

理性思考的有趣表達 太多了,人類感知中的世界裡 1 1 1的現象比比皆是,因為概念或感知常常是人類對現實的一種 四捨五入 式的概括。如 0.6 0.7 1.3 被四捨五入地認識後就是1 1 1 數學中的 分球悖論 你搜一下,會發現它也是1 1 1的翻版,1顆球可由兩顆與之半徑相同的球經過分割重組的方...

《LOL》到底什麼情況下輔助可以遊走?

鄙人失陪 基本上看隊友了,有時候可以跟自家打野互動一下,一起反野或一起抓中,視野很重要,千萬別被反蹲,adc能力比較差就別遊走了除非他廢了。有時候我玩輔助從下路GANK到上路也不是沒有過 暗夜獵手 Vayne 瀉藥輔助主玩洛,絕大多數情況都會早做五速鞋,配合打野遊走。由於畢竟不是專業輔助,理解不一定...

「了」和「著」在什麼情況下可以互相替換,什麼情況下不可以?

poem 著 了是動詞的體 aspect 而非時 tense 著是持續體 進行體 了是完成體。而在看起來像是著 了可替換的句例裡,都涉及到了存在體。比如古代漢語裡有 設有 這樣的表示式 現代漢語裡仍可這樣說 其中的 有 就是存在體。於是,在這些句例裡,著兼為 持續體,存在體 了兼為 完成體,存在體 ...