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、索引优化

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

 

posted on 2017-04-17 16:09  小莹莹  阅读(5000)  评论(0编辑  收藏  举报