NestLu
NestLu
2019-03-28 16:58

MYSQL查询用到的主键id索引问题

  • mysql

CREATE TABLE mytest (
id int(10) NOT NULL AUTO_INCREMENT,
a int(50) DEFAULT NULL,
b int(50) DEFAULT NULL,
c int(50) DEFAULT NULL,
index int(50) DEFAULT NULL,
remark1 varchar(255) DEFAULT NULL,
remark2 varchar(255) DEFAULT NULL,
remark3 varchar(255) DEFAULT NULL,
remark4 varchar(255) DEFAULT NULL,
PRIMARY KEY (id)
) ENGINE=InnoDB AUTO_INCREMENT=10059857 DEFAULT CHARSET=utf8 COMMENT='测试1000万数据';

本人菜鸟,希望大佬们多多指教
这是本人测试建的表,插入了1000万数据,主要是为了测试一下mysql千万数据分页查询时的速度,查询8000000往后100条数据
建表因为主键id唯一自增,所以默认为主键索引

查看索引

SELECT * from mytest limit 8000000,100

OK
时间: 8.106s
此查未使用到索引,耗时比较久

SELECT * from mytest where id>(SELECT id from mytest LIMIT 8000000,1) limit 100

OK
时间: 5.87s
此处似乎用到了索引,速度有所提升?

这是explain结果
图片说明
此处是外面查询用到了索引,子查询未用到索引吗?试了多次发现都是差不多这个速度,感觉还是挺慢的

然后
按理说主键id已经是自增索引,查询速度应该很快才对吧,这时候我又对主键id这个字段单独创建了一个普通索引
CREATE index id_index on mytest(id)

OK
时间: 26.275s

查询索引

查看索引发现和主键索引应该没啥区别,可是,,,

发现查询居然变快了不少???
SELECT * from mytest limit 8000000,100

OK
时间: 9.242s
这里未用到索引

SELECT * from mytest where id>(SELECT id from mytest LIMIT 8000000,1) limit 100

OK
时间: 1.853s

这是explain结果
图片说明

这里应该是用到了索引,可是为什么会出现这种情况呢,主键id也是索引,查询就比较慢,单独对id创建了一个普通索引查询速度居然变快了许多,想了半天没明白为啥,求前辈们指教

此外查询时我也尝试连表查询
SELECT * from mytest a join (SELECT id from mytest limit 8000000,100) b on a.id=b.id;
发现和SELECT * from mytest where id>(SELECT id from mytest LIMIT 8000000,1) limit 100;这个查询耗时几乎一致

附一下表数据

图片说明

  • 点赞
  • 回答
  • 收藏
  • 复制链接分享

0条回答

为你推荐

换一换