本文共 641 字,大约阅读时间需要 2 分钟。
先索引扫描,再通过ID去取索引中未能提供的数据,即为回表。
mysql> create table T(id int primary key, k int not null, name varchar(16),index (k))engine=InnoDB;
如果语句是 select * from T where ID=500,即主键查询方式,则只需要搜索 ID 这棵 B+ 树;
mysql> select * from T where ID=500;+-----+---+-------+| id | k | name |+-----+---+-------+| 500 | 5 | name5 |+-----+---+-------+1 row in set (0.00 sec)
如果语句是 select * from T where k=5,即普通索引查询方式,则需要先搜索 k 索引树,得到 ID 的值为 500,再到 ID 索引树搜索一次。这个过程称为回表。
mysql> select * from T where k=5;+-----+---+-------+| id | k | name |+-----+---+-------+| 500 | 5 | name5 |+-----+---+-------+1 row in set (0.00 sec)
也就是说,基于非主键索引的查询需要多扫描一棵索引树。因此,我们在应用中应该尽量使用主键查询
转载地址:http://paorb.baihongyu.com/