mysql查询千万级数据愈来愈慢优化:mysql
1.分表:(固定某个表存多少数量的数据:例如:一张表存100w的数据量);redis
2.优化sql和创建适合的索引(复合索引);sql
3.使用redis缓存。(redis存一份ID.而后mysql存一份ID每次插入删除的时候同步便可。查询的时候只须要从redis里面找出适合的10个ID,而后到mysql里面查询出10条)缓存
记录便可);优化
4.总数要单独处理:涉及到总数操做,专门维护一个总数。(例如:新注册一个会员,总数值加1,须要总数的时候直接拿这个总数,也能够在这个表上添加了触发器并建立一个专门用来统计总行数的表spa
添加更新删除该表就会触发,分析条件后直接把统计表的相应字段累加,查询的时候直接读取统计表中的相应字段就能够了准确度没问题,若是有条件查询分页,那么分页表的数据就发挥不了左右)。线程
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到了百万级分页是个极限。
提示:
一、用的myisam仍是innodb,myisam的查询速度明显比innodb快不少。
二、能不加where条件的尽可能不加。
三、索引优化
(能够从业务上进行了优化,规定只查询指定时间内的数据,或者必定时间内的数据。查询全部总数数据也能够使用缓存)