当数据量大的时候一般的分页就吃不消了,先是把COUNT(*)计算总数的SQL给去掉,然后再优化LIMIT查询
传统分页查询:SELECT c1,c2,cn... FROM table LIMIT n,m
MySQL的limit工作原理就是先读取前面n条记录,然后抛弃前n条,读后面m条想要的,所以n越大,偏移量越大,性能就越差。
推荐分页查询方法:
1、 SELECT c1,c2,cn... FROM table WHERE id>=20000 LIMIT 10;
2、子查询法
SELECT c1,c2,cn... FROM table WHERE id>=
(
SELECT id FROM table LIMIT 20000,1
)
LIMIT 10;
3、高性能MySQL一书中提到的只读索引方法
优化前SQL: SELECT c1,c2,cn... FROM member ORDER BY last_active LIMIT 50,5
优化后SQL: SELECT c1,c2,cn... FROM member INNER JOIN (SELECT member_id FROM member ORDER BY last_active LIMIT 50, 5) USING (member_id)
分别在于,优化前的SQL需要更多I/O浪费,因为先读索引,再读数据,然后抛弃无需的行。而优化后的SQL(子查询那条)只读索引(Cover index)就可以了,然后通过member_id读取需要的列。
4、第一步用用程序读取出ID,然后再用IN方法读取所需记录
程序读ID:SELECT id FROM table LIMIT 20000,10;
SELECT c1,c2,cn... FROM table WHERE id IN(id1,id2,idn...)
1111

被折叠的 条评论
为什么被折叠?



