起首看一下分页的根本原理:
复造代码 代码如下:
mysql> explain SELECT * FROM message ORDER BY id DESC LIMIT 10000, 20G ***************** 1. row ************** id: 1 select_type: SIMPLE table: message type: index possible_keys: NULL key: PRIMARY key_len: 4 ref: NULL rows: 10020 Extra: 1 row in set (0.00 sec)
一,最常见MYSQL最根本的分页体例:
select * from content order by id desc limit 0, 10
在中小数据量的情况下,如许的SQL足够用了,独一需要留意的问题就是确保利用了索引。跟着数据量的增加,页数会越来越多,查看后几页的SQL就可能类似:
select * from content order by id desc limit 10000, 10
就是越往后分页,LIMIT语句的偏移量就会越大,速度也会明显变慢。
此时,能够通过2种体例:
一,子查询的分页体例来进步分页效率,飘易用的SQL语句如下:
SELECT * FROM content WHERE id> (SELECT id FROM content ORDER BY id desc LIMIT ".($page-1)*$pagesize.", 1) ORDER BY id desc LIMIT $pagesize
为什么会如许呢?因为子查询是在索引上完成的,而通俗的查询时在数据文件上完成的,凡是来说,索引文件要比数据文件小得多,所以操做起来也会更有效率。(via)通过explain SQL语句发现:子查询利用了索引!
若何优化Mysql万万级快速分页?两步。
1,垂曲分表。拆表,按你的各个应用场景,如微信登录、电话登录,每个应用场景一张表,那张表的字段比原表少,仅仅将该场景用到的字段存进去。
2,程度分表。颠末第一部后,将每个子表停止程度拆分,。详细办法,好比手机号登录场景的子表,可按手机号末尾一位取模,再分为10个子表,每个子表数据量百万级,mysql性能差不多能够忍耐。对了,别忘建个索引。
总结一下,要到达的目标无非两个:瘦表,单表数据量级不要超越百万级