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;这个查询耗时几乎一致
附一下表数据