数据库表
CREATE TABLE `goods` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(10) DEFAULT NULL,
`price` double DEFAULT NULL,
`create_time` datetime DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `idx_name` (`name`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=12577925 DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT;
在表当中我们插入了1000万条数据.
查询商品名称查询,从80万数据上拿10条:
select * from goods where limit 800000,10;
执行时间
执行时间:48.307s
方法
SELECT
g.*
FROM
goods g
INNER JOIN
( SELECT id FROM goods WHERE NAME = "商品1" LIMIT 800000, 10 ) t
ON t.id = g.id;
我们先查询出符合条件的id,在连接表查询出数据
执行结果
执行时间:0.169秒
原理:
当我们直接通过limit 直接查询数据时,我们是通过name普通索引搜索数据.比如我们有200万条数据符合条件,我们就要去主键索引寻找200万次.然后取出10条.
如果我们先根据name 查询主键id,先获取符合条件10条数据,我们再去表连接,我们只需要去主键索引上10次.