Q1:
select count(*) from t;
t中有id(主键),name,age,sex4个字段,假如数据10条,对sex增加索引,用explain 查看执行打算发现用了sex索引,为什么不是主键索引呢?
A1:
- MySQL Innodb的主键索引是一个B+树,数据存储在叶子节点上,10条数据,就有10个叶子节点;
- sex索引是辅助索引,也是一个B+树,不同之处在于,叶子节点存储的是主键值,因为sex只有2个可能的值:男和女,因而,这个B+树只有2个叶子节点,比主键索引的B+树小的多;
- 这个表有主键,因而不存在所有字段都为空的记录,所以COUNT(*)只有统计所有主键的值就能够了,不须要回表读取数据;
- SELECT COUNT(*) FROM t,应用sex索引,只须要拜访辅助索引的小B+树,而应用主键索引,要拜访主键索引的那个大B+树,明细工作量大,这就是优化器应用辅助索引的起因。