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 没加排序,也没用到索引,全表扫描了。行数也对应增加了许多。

 

posted @ 2020-07-03 13:01  _Phoenix  阅读(827)  评论(0编辑  收藏  举报