8 回答
TA贡献1829条经验 获得超6个赞
对于几百万行+的大表来说,COUNT(*)是非常耗时的,你看能不能换个方式处理下。
要么在业务上索性就不统计,你想想你做分页,每页10条数据,两百万行就是 20 万页,你统计了别人会翻这么多页吗。
另一种方式就是如果你的主键是连续递增的,就可以通过边界值相减得到统计结果,这比你直接 count 肯定是减少了不少时间。
TA贡献1818条经验 获得超7个赞
100w行数据,你内存又不够,分表吧,分成十个。
然后判断哪几个表在时间区间内有数据(查询第一个和最后一个数据即可判断)
最后只在这几个表中查询,汇总,这样大概能减少80%的内存占用和时间。
如果还嫌速度慢,那就大数据,多台服务器并发查询各自的子表,最后加和。
TA贡献2011条经验 获得超2个赞
1、数量,@rift说的对,你做分页页数太多别人也不会翻这么多页
2、分页查询数据可以分为两步吧
1) select id from XXX where xxx=xx;
2) select * from XXX where id in (ids)
这样查询会好些
TA贡献1807条经验 获得超9个赞
建议使用MySQL分区表,用addtime作为分区字段,不要任何索引。查询的时候带分区字段,确保查询扫描的分区表个数在一个很少的数量。这个方案不需要改动数据表结构和改动代码,实施成本低,效果很不错。
TA贡献1811条经验 获得超4个赞
如果 id
是连续的,可以使用 id
作为分页依据
SELECT field FROM table_name WHERE `id` < num1 and `id` > num2
或者, id
+ limit
配合使用
SELECT field FROM table_name WHERE `id` > num LIMIT page_size
这样做的目的:
大数据量时,
LIMIT OFFSET
效率太低id
唯一,自增,效率高于普通索引
TA贡献1831条经验 获得超4个赞
你explain这条查询语句,由于count(*),type字段肯定是All,所以肯定是走全表的,但是如果你是count(id),应该会是ref,因为addtime你加索引了。
添加回答
举报