今天在群里面遇到一个人问的问题
他只问了一个问题:为何查询了主键,却没有使用主键索引,因为我对这方面不是太了解,所以引出了如下几个问题
1、count(*)走了索引
count(*) count(1)会使用覆盖索引(Using index)
(Using index : 列数据是从仅仅使用了索引中的信息而没有读取实际的行动的表返回的,这发生在对表的全部的请求列都是同一个索引的部分的时候)
2、count(col)当col为索引字段并且where条件使用此字段时会走索引,否则不会
3、为什么默认使用了idx_createtime索引
试验方法:
(1)增加title索引,发现依旧使用createtime,而title的key_len为603,createtime为9
(2)去掉title索引,增加isDel索引,发现默认使用了isDel,key_len为2,且与主键索引相同,
结论:默认会使用key_len最小的索引,#遗留问题,为何普通索引和主键索引key_len相同而使用了普通索引
4、表没数据的情况下Impossible WHERE noticed after reading const tables
会出现这个情况,百度出来的结果是因为数据位空的原因,当不为空时会出现Using where;Using index
下面提供下表的创建:
CREATE TABLE `cms_content` ( `contentid` int(11) NOT NULL AUTO_INCREMENT, `title` varchar(200) DEFAULT NULL, `xmlInfo` text, `xmlContent` mediumtext, `createTime` datetime DEFAULT NULL, `uploadTime` datetime DEFAULT NULL, `proposeSpecCode` varchar(10) DEFAULT NULL, `isDel` bit(1) DEFAULT NULL, `isUpdate` int(11) DEFAULT '0', PRIMARY KEY (`contentid`), KEY `pk_content_proposeSpecCode` (`proposeSpecCode`), KEY `idx_createtime` (`createTime`) )
测试用到的sql
EXPLAIN SELECT * FROM cms_content;
EXPLAIN SELECT contentid FROM cms_content;
EXPLAIN SELECT title FROM cms_content;##不会索引
EXPLAIN SELECT COUNT(*) FROM cms_content;
EXPLAIN SELECT COUNT(1) FROM cms_content;
EXPLAIN SELECT COUNT(*) FROM cms_content WHERE title='11';
EXPLAIN SELECT COUNT(*) FROM cms_content WHERE contentid=11;
EXPLAIN SELECT COUNT(contentid) FROM cms_content;
EXPLAIN SELECT COUNT(isDel) FROM cms_content