假设我们现在有一个表,表结构如下所示:
CREATE TABLE `table` (
`id` INT unsigned NOT NULL AUTO_INCREMENT,
`a` varchar(255) NOT NULL DEFAULT '',
`b` INT unsigned NOT NULL DEFAULT 0,
`c` text NOT NULL DEFAULT '',
PRIMARY KEY (`id`),
KEY `index` (`a`, `b`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
可以看到,我们定义了一个复合索引 index(a,b),现在我们用这个复合索引来进行一条SQL查询:
select * from table where b = 88;
当查询的是所有字段,那么此时就没有必要使用索引了,为啥?
我们来个反证:假设现在还是使用 index 复合索引,那么就需要把 index 索引整个读一遍,然后过滤出满足条件的数据,由于索引中没有保存 c 字段的值,所以还需要回表操作,再去主键索引中找到对应的记录,这一路操作下来太麻烦了,光 B+Tree 都读了两棵(而且第一颗 B+Tree 还是遍历),那我们还不如直接遍历主键索引呢!主键索引里要啥有啥,遍历完了想要的数据都有了,遍历主键索引其实就是我们常说的全表扫描。
最后总结一下:是否索引并非万金油,还得结合业务和现实情况!
10万+





