mysql怎么看用没用到索引_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;

e72efad6799b4388bad5c91f55ba839c.png

EXPLAIN SELECT id,fname FROM t_attach_new LIMIT 2000000,10;

7b3dc1cb902665eb69a0ec5714bb1730.png

为什么扫描行数一样,第一个没用索引,第二个用了呢?

第一个是直接扫描的所有数据行,并且没用到主键索引,但是和用到主键索引一样返回的相同的数据行(看下面的二可以清晰看到区别)

第二个是直接用了fname这个索引,但是返回的数据行与第一个不一致。

返回的数据

SELECT id,fname,web_url FROM t_attach_new LIMIT 2000000,10;

SELECT id,fname FROM t_attach_new LIMIT 2000000,10;

03ccc0e9caca1d43e8bed8cda0d12b93.png

a097168ed0cfcee5092544e0098a4825.png

补充 explain type类型:

2e7eb5b6b925743f13a6d913bf28dd9c.png

二、接着看一下这三个查询的区别,看看怎么才用到索引

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;

a6f426ae761742e3395fee794acba8a0.png

3e8ac9b53954a21785f604f847a8cbaf.png

709e7b9dffa306a0f5ce064553d89ad8.png

可以看出,1,3 加了order by 的查询直接用主键索引了。2 没加排序,也没用到索引,全表扫描了。行数也对应增加了许多。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值