zoukankan      html  css  js  c++  java
  • 分页查询千万级数据慢

    mysql查询千万级数据越来越慢优化:

    1.分表:(固定某个表存多少数量的数据:例如:一张表存100w的数据量);

    2.优化sql和建立适合的索引(复合索引);

    3.使用redis缓存。(redis存一份ID.然后mysql存一份ID每次插入删除的时候同步即可。查询的时候只需要从redis里面找出适合的10个ID,然后到mysql里面查询出10条)

    记录即可);

    4.总数要单独处理:涉及到总数操作,专门维护一个总数。(例如:新注册一个会员,总数值加1,需要总数的时候直接拿这个总数,也可以在这个表上添加了触发器并创建一个专门用来统计总行数的表

    添加更新删除该表就会触发,分析条件后直接把统计表的相应字段累加,查询的时候直接读取统计表中的相应字段就可以了准确度没问题,如果有条件查询分页,那么分页表的数据就发挥不了左右)。

    5.可通过定时任务去批量查询总数,例如:开启10个线程去批量计算总数,然后再各自相加即可,不过这样会导致内存(CPU)过高,而造成内存溢出。

    6.修改原有界面内容,单独去查询总数,需要即去查询。也可以用ID建立一定的区间,比如查询最新的记录,每次只是查询2w条的记录。

        每次只要查最新的一条记录,id是自增字段,取当前的这个id值就可以大约知道总条数了(注意:项目里并不会删除参与记录),但是这种不适合带条件的查询。

    另外一种查询条数:

    SELECT * FROM table WHERE id BETWEEN 1000000 AND 1000010;

    如果需要查询 id 不是连续的一段,最佳的方法就是先找出 id ,然后用 in 查询

    SELECT * FROM table WHERE id IN(10000, 100000, 1000000...);

    使用IN这种基本就是0s级别的。

    优化注意事项:

    1.多个表关联的时候建议相关联的表都建立索引。

    2.在order by 和where语句中的建议建立联合索引来提升查找速度。

    3.分页最好别让别人看到10万条以后的数据,要不然会很慢!就算用索引。经过这样的优化,mysql到了百万级分页是个极限。

    提示:

    1、用的myisam还是innodb,myisam的查询速度明显比innodb快很多。

    2、能不加where条件的尽量不加。

    3、索引优化

    (可以从业务上进行了优化,规定只查询指定时间内的数据,或者一定时间内的数据。查询所有总数数据也可以使用缓存)

  • 相关阅读:
    MySql行锁等待时间
    日志工具类-Mapper静态调用
    MySql锁机制理解记录
    Flink之TableAPI和SQL(5):表的时间特性
    Flink之TableAPI和SQL(4):表的Sink实现
    Flink之TableAPI和SQL(3):通过TableAPI和SQL表的一些操作(包括查询,过滤,聚集等)
    Flink之TableAPI和SQL(2):表和外部系统的连接方式
    Flink之TableAPI和SQL(1):基本功能描述
    sb 错误
    洛谷 P6189
  • 原文地址:https://www.cnblogs.com/liuying1995/p/6723417.html
Copyright © 2011-2022 走看看