mysql大数据量的大表分页优化,按照时间字段排序,该字段有重复值,同时与主键id排序不一致.

您所在的位置:网站首页 mysql查询按时间排序的第一条数据 mysql大数据量的大表分页优化,按照时间字段排序,该字段有重复值,同时与主键id排序不一致.

mysql大数据量的大表分页优化,按照时间字段排序,该字段有重复值,同时与主键id排序不一致.

2024-07-12 02:25| 来源: 网络整理| 查看: 265

当表达到几十万条时, 使用limit语句分页查询将会出现问题.查询比较靠前的数据还好,但要是比较靠后的数据就会出现变得非常慢. 

需求: 有一个上百万行的大表, 需要按照其时间字段顺序分页读取, 该字段的顺序与主键id顺序并不一致. 而且该字段会有重复. 对于大表的分页网上方法是按照主键id顺序分页, 所以可以利用到主键id的递增特性达到效果: 如下面演示:

select * from table_name order by id asc limit 500000,10; //普通分页语句 //转换后的, 该语句查询非常快 select * from table_name where id > (select id from table_name order by id asc limit 500000,10) limit 10

   但是本需求中, 显然无法利用这个特性, 因其有重复值. 

 

解决方案:  首先肯定是先对时间字段(假设该字段名为create_time)加上索引了, 加上索引后limit 0,10这种查询靠前的语句就非常快, 但是limit 500000,10语句这种查询靠后数据的查询就慢得令人发指, 一般需要好几秒. explain查询计划可以看到limit 50000.10这个语句mysql要先扫描前500000行后才能读到数据,所以这就非常慢了. 在步骤1上继续优化.  //对于几十万表基本都能在1s内查出来 select * from table_name where id in (SELECT id from (select id from table_name LIMIT 500000,10) as tmp) // 1.其中使用(SELECT id from (select


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3