1、B+Tree
索引的数据结果是B+Tree,它比BTree查询时,以更少的IO次数占优势。
2、聚集索引与非聚集索引
聚集索引:索引的逻辑顺序与磁盘上数据的物理顺序相同。(表中最多只有一个)
比如ID(主键),和数据行顺序一致。
非聚集索引:索引的逻辑顺序与磁盘上行的物理存储顺序不同,一个表中可以拥有多个非聚集索引。(表中可以有多个)
3、索引之所以快的原因
例子,表user(id,name,age)
聚集索引:当我们指定了主键(id)时,就默认创建了聚集索引,B+Tree的节点中存放主键列的数据,叶子节点存放真实的物理数据行。
非聚集索引:
比如按照name创建索引:create index idx_name on user(name);
此时的非聚集索引的‘节点会存放name列的值,然后叶子节点存放id(主键值),得到主键值就能唯一定位数据行。
此时执行查询:
(1) select id,name from user where name = "张三";
(2) select name from user where name = "张三";
此时,直接可以从非聚集索引获取查询数据,不会进行二次查询。
但是,如果查询age字段,则会先查到id后,在根据id去查一遍。二次查询降低了查询效率。最好避免二次查询。
解决:采用复合索引(覆盖索引) create index idx_name on user(name,age);