表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字段的数据。 查了两个索引树,这就叫回表。
索引覆盖就是查找该索引以找到您需要的所有数据,而无需转到另一个数据结构。事实上,你只是不需要回到手表上。
[En]
Index coverage is to look up this index to find all the data you need, without going to another data structure. In fact, you just don’t have to go back to the watch.
怎么避免?不是必须的字段就不要出现在SELECT里面。或者b,c建联合索引。但具体情况要具体分析,索引字段多了,存储和插入数据时的消耗会更大。这是个平衡问题
原文:https://blog.csdn.net/qq_43410909/article/details/122437980
Original: https://www.cnblogs.com/crazy-lc/p/16474311.html
Author: MyBeans
Title: 什么是回表,怎么解决?
原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/505230/
转载文章受原作者版权保护。转载请注明原作者出处!