测试表USER_INFO的数据和结构如下
EXPLAIN SELECT count(*) from USER_INFO
的结果是
EXPLAIN SELECT count(id) from USER_INFO
的结果是:
EXPLAIN SELECT count(1) from USER_INFO
的结果是:
发现走的都是主键索引。
接下来给USER_INFO表加上一个辅助索引idx_user_name
再次运行EXPLAIN SELECT count(*) from USER_INFO
的结果是:
再次运行EXPLAIN SELECT count(id) from USER_INFO
的结果是:
再次运行EXPLAIN SELECT count(1) from USER_INFO
的结果是:
发现走的都是二级索引idx_user_name了,即使count()的是主键。
总结
如果有二级索引,那么在做Count(*),count(主键),count(1)操作时,mysql优化器就会选择使用二级索引,这是在mysql5.7.18版本后有的优化,因为二级索引只存主键值,而没存真实数据,所以二级索引树比主键索引树更小,其次直接扫描二级索引树获取数据量也避免了回表操作,所以mysql优化器会选择成本更小的二级索引,不过要注意成本小,不意味着消耗时间少,这二者不是完全等同的。