# limit(分页) ## 1.通常count(\*)方式 ~~~ SELECT COUNT(*) FROM foo WHERE b = 1; SELECT a FROM foo WHERE b = 1 LIMIT 100,10; ~~~ ## 2.SQL\_CALC\_FOUND\_ROWS方式 ~~~ //SQL_CALC_FOUND_ROWS会忽略limit,FOUND_ROWS()时返回符合条件的记录总数 使用场景 1.排序,where条件较多,索引不能解决问题,需要扫描全表 2.如果主键排序使用索引,count(*)或需更快 3.缺点,不管是否需要,MySQL都会扫描所有满足条件的行,然后再抛弃掉不需要的行 SELECT SQL_CALC_FOUND_ROWS a FROM foo WHERE b = 1 LIMIT 100, 10; SELECT FOUND_ROWS() as count; ~~~ ## 3.子查询方式 ~~~ 使用场景 1.主键排序查询,数据必须是连续的,可以说不能有where条件 2.跳转页码少,最好只有上一页,下一页两个按钮 (1)使用记录主键的方式进行优化 select * from p2p where main_id > 1000000 order by main_id limit 10; (2)使用子查询进行查询 select * from p2p where main_id >= (select main_id from p2p limit 1000000,1) limit 10; select * from ( select id from wl_tagindex where byname='f' order by id limit 300000,10 ) a left join wl_tagindex b on a.id=b.id (3)主键连续时,使用between SELECT * FROM table WHERE id BETWEEN 1000000 AND 1000010; ~~~ ## 4.in查询方式 ~~~ 两个相对复杂的关联查询,第一个只查id主键,第二个用一查出来的in查询,也是变相的子查询 ~~~