mysql回表_到底什么情况下mysql innodb会发生回表操作?
謝邀
MySQL innodb的主鍵索引是簇集索引,也就是索引的葉子節(jié)點(diǎn)存的是整個(gè)單條記錄的所有字段值,不是主鍵索引的就是非簇集索引,非簇集索引的葉子節(jié)點(diǎn)存的是主鍵字段的值。回表是什么意思?就是你執(zhí)行一條sql語(yǔ)句,需要從兩個(gè)b+索引中去取數(shù)據(jù)。舉個(gè)例子:
表tbl有a,b,c三個(gè)字段,其中a是主鍵,b上建了索引,然后編寫sql語(yǔ)句
SELECT * FROM tbl WHERE a=1
這樣不會(huì)產(chǎn)生回表,因?yàn)樗械臄?shù)據(jù)在a的索引樹中均能找到
SELECT * FROM tbl WHERE b=1
這樣就會(huì)產(chǎn)生回表,因?yàn)閣here條件是b字段,那么會(huì)去b的索引樹里查找數(shù)據(jù),但b的索引里面只有a,b兩個(gè)字段的值,沒有c,那么這個(gè)查詢?yōu)榱巳〉絚字段,就要取出主鍵a的值,然后去a的索引樹去找c字段的數(shù)據(jù)。查了兩個(gè)索引樹,這就叫回表。
索引覆蓋就是查這個(gè)索引能查到你所需要的所有數(shù)據(jù),不需要去另外的數(shù)據(jù)結(jié)構(gòu)去查。其實(shí)就是不用回表。
怎么避免?不是必須的字段就不要出現(xiàn)在SELECT里面。或者b,c建聯(lián)合索引。但具體情況要具體分析,索引字段多了,存儲(chǔ)和插入數(shù)據(jù)時(shí)的消耗會(huì)更大。這是個(gè)平衡問題。
總結(jié)
以上是生活随笔為你收集整理的mysql回表_到底什么情况下mysql innodb会发生回表操作?的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mysql8.0 服务移除_Linux下
- 下一篇: docker mysql忘记密码_doc