1.索引可以分为聚簇索引和非聚簇索引。聚簇索引的特点是叶子节点包含了完整的记录行,而非聚簇索引的叶子节点只有索引字段和主键ID。非聚簇索引中因为不含有完整的数据信息,查找完整的数据记录需要回表,所以一次查询操作实际上要做两次索引查询。而如果所有的索引查询都要经过两次才能查到,那么肯定会引起效率下降,毕竟能少查一次就少查一次。
索引与数据存放在一起,找到索引的同时也找到了数据;聚簇索引具有唯一性,一张表只有一个聚簇索引。
聚簇索引默认是主键,如果表中没有定义主键,InnoDB 会选择一个非空唯一索引代替。如果没有,InnoDB 会使用隐藏的_rowid
列来作为聚簇索引。
2.回表,查询的目标字段A无索引,或A上有索引但未作为查询条件;
查询条件B非聚簇索引,查询过程会先在B的索引树上扫描找到聚簇索引(通常是主键);
然后再通过主键到聚簇索引树上找到整条记录,这个过程就叫回表。
3.如何避免回表现象,索引覆盖,就是查这个索引能查到你所需要的所有数据,不需要去另外的数据结构去查。不要用select *,就是不是必须的字段就不要出现在SELECT里面。或者b,c建联合索引。但具体情况要具体分析,索引字段多了,存储和插入数据时的消耗会更大。