直接用变通的查询方式,查询时间高的吓人,因为有些数据查询是不连贯的,不能用大于多少或等于多少来查询; [sql] => SELECT * FROM `article_comments` ORDER BY id DESC LIMIT 199980, 20; [time] => 0.438656 [sql] => SELECT * FROM `article_comments` ORDER BY id DESC LIMIT 1999980, 20; [time] => 26.835051 [sql] => SELECT * FROM `article_comments` ORDER BY id DESC LIMIT 19999980, 20; [time] => 31.343988 [sql] => SELECT * FROM `article_comments` ORDER BY id DESC LIMIT 29999980, 20; [time] => 32.138655
现在的做法是通过先查询取出 id SELECT id FROM `article_comments` LIMIT 19999980, 20;
然后用 id 去取数据 SELECT * FROM `article_comments` WHERE id IN('1','2'....); 虽然这样优化了很多,但是也不是很理想,如果取的 ID 间隔大,也会进行全表扫描; 看 V2 能人很多,不知道还有没更优化的方法?
1. 大数据下分页舍弃精度换效率,一般都用 where id > 199980。 2. 可以试试可以延迟关联, select * from tableName inner join (select id from tableName limit 199980,20) as tmp using(id); 3. 如果一定要追求精度建议数据不进行物理删除,删除时做逻辑删除,这样 id 就不会缺失。
syncher
2017-08-10 00:32:58 +08:00
> 现在的做法是通过先查询取出 id SELECT id FROM `article_comments` LIMIT 19999980, 20;
另外,如果这条 SQL 查询速度很慢那么是不是因为你使用的是 InnoDB 引擎,InnoDB 下默认为聚集索引,聚集索 ID 和数据存一起,所以通过 id 查询很慢,如果是这样可以考虑在其他列和 id 列上建立联合索引,查询时使用索引覆盖。
ALTER TABLE article_comments ADD INDEX id_c1(id,c1);
SELECT id FROM `article_comments` ORDER BY id,c1 LIMIT 19999980, 20;