回表和覆盖索引

什么是回表,举个例子,建一张表order。
表字段有id,mcode,code,detail;id为主键,mcode字段加索引
现在根据mcode查询所有的code(根据主单编号,查询所有的子单编号)
语句:select code from order where mcode = ‘M001’;
这时候数据库会怎么操作呢?
因为mcode索引,所以查询mcode的索引,查到符合要求的数据的rowid(索引内是不会保存具体数据的),再根据rowid,查询到具体的数据,拿到code。
这就是回表,简单来说就是:数据库根据索引找到了指定的记录所在行后,还需要根据rowid再次到数据块里取数据的操作

如何避免回表呢,这就用到覆盖索引,但是我觉得叫索引覆盖更合适
不使用mcode的索引,使用(mcode,code)的联合索引。
在查找到mcode的索引后,可以直接拿到code了,不需要再回表。
个人觉得叫索引覆盖是,利用联合索引避免了回表,只是把要查的数据覆盖了而已。

当然,覆盖索引肯定有局限性,查的字段较少。比较有特殊性。

你可能感兴趣的:(数据库)