mysql查询用不用索引疑问
一、单表查询索引列和查询索引列+其他非索引列 查询数据速度为什么有差?为什么查询非索引列会不走索引?
现象: 单个表,结构如下:
CREATE TABLE `t_attach_new` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`fname` varchar(100) NOT NULL DEFAULT '',
`ftype` varchar(50) DEFAULT '',
`fkey` text NOT NULL,
`authorId` int(10) DEFAULT NULL,
`created` int(10) NOT NULL,
`hash` varchar(255) DEFAULT NULL,
`web_url` varchar(255) DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `fname` (`fname`),
KEY `created` (`created`),
KEY `id` (`id`,`created`),
KEY `created_2` (`created`,`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2621401 DEFAULT CHARSET=utf8;
查询语句,下面两个。
EXPLAIN SELECT id,fname,web_url FROM t_attach_new LIMIT 2000000,10;
EXPLAIN SELECT id,fname FROM t_attach_new LIMIT 2000000,10;
为什么扫描行数一样,第一个没用索引,第二个用了呢?
第一个是直接扫描的所有数据行,并且没用到主键索引,但是和用到主键索引一样返回的相同的数据行(看下面的二可以清晰看到区别)
第二个是直接用了fname这个索引,但是返回的数据行与第一个不一致。
返回的数据
SELECT id,fname,web_url FROM t_attach_new LIMIT 2000000,10;
SELECT id,fname FROM t_attach_new LIMIT 2000000,10;
补充 explain type类型:
二、接着看一下这三个查询的区别,看看怎么才用到索引
EXPLAIN SELECT id,fname,web_url FROM t_attach_new ORDER BY id LIMIT 2000000,10;
EXPLAIN SELECT id,fname,web_url FROM t_attach_new LIMIT 2000000,10;
EXPLAIN SELECT id,fname FROM t_attach_new ORDER BY id LIMIT 2000000,10;
可以看出,1,3 加了order by 的查询直接用主键索引了。2 没加排序,也没用到索引,全表扫描了。行数也对应增加了许多。