最基本的分页方式: SELECT … FROM … WHERE … ORDER BY … LIMIT … 在中小数据量的情况下,这样的SQL足够用了,唯一需要注意的问题就是确保使用了索引: 举例来说,如果实际SQL类似下面语句,那么在category_id, id两列上建立复合索引比较好: SELECT * FROM articles WHERE category_id = 123 ORDER BY id LIMIT 50, 10 子查询的分页方式: 随着数据量的增加,页数会越来越多,查看后几页
前言
通常针对MySQL大数据量的查询采取“分页”策略,但是如果翻页到比较靠后的位置时查询将变得很慢,因为mysql将花费大量的时间来扫描需要丢弃的数据。
基本分页技巧
通常情况下,为了实现高效分页,需要在查询中WHERE条件列和排序列应用组合索引。
例如,建立索引(a,b,c)使得以下查询可以使用索引,提高查询效率:
1、字段排序
ORDER BY a
ORDER BY a,b
ORDER BY a, b, c
ORDER BY a DESC, b DESC, c DESC
2、筛选
当需要从数据库查询的表有上万条记录的时候,一次性查询所有结果会变得很慢,特别是随着数据量的增加特别明显,这时需要使用分页查询。对于数据库分页查询,也有很多种方法和优化的点。下面简单说一下我知道的一些方法。
准备工作
为了对下面列举的一些优化进行测试,下面针对已有的一张表进行说明。
表名:order_history
描述:某个业务的订单历史表
主要字段:unsigned int id,tinyint(4) int type
字段情况:该表一共37个字段,不包含text等大型数组,最大为varcha
一,最常见MYSQL最基本的分页方式: 代码如下:select * from content order by id desc limit 0, 10在中小数据量的情况下,这样的SQL足够用了,唯一需要注意的问题就是确保使用了索引。随着数据量的增加,页数会越来越多,查看后几页的SQL就可能类似: 代码如下:select * from content order by id desc limit 10000, 10一言以蔽之,就是越往后分页,LIMIT语句的偏移量就会越大,速度也会明显变慢。此时,
在对大表进行分页时,如果在服务端实现分页,大多数情况采用SQL的limit语法来实现。但是当页数越来越大时,性能很可能成为问题,尤其是需要查询表的所有字段。
1. 索引与非索引字段
在查询的结果集中,如果只包含索引字段,性能相比于包含非索引字段,差别很大。下面是一个简单的例子,在大约50w行的表上操作:
只查询索引id字段
SELECT id FROM test.bas_table
limit 400000,1000;
– 0.094 second
查询
一、分页查询
应用场景:当要显示的数据,一页显示不全,需要分页提交SQL请求
语法:
执行顺序从1-9
SELECT 查询列表 7
FROM 表名 1
JOIN 表2 2
ON 连接条件 3
WHERE 筛选条件 4
GROUP BY 分组条件 5
HAVING 分组后筛选 6
ORDER BY 排序字段 8
LIMIT offset, size 9
注意: offset 为起始索引,默认从0开始 siz