1.语法:
*** limit [offset,] rows
一般是用于select语句中用以从结果集中拿出特定的一部分数据。
offset是偏移量,表示需要的数据是跳过多少行数据之后的,可以忽略;rows表示要拿多少行数据。
2,场景:
前台要展示数据库中数据,需要后台实现分页,传入数据要有“页码page”跟“每页数据条数nums”。
select * from t_table order by id limit (page-1)*nums,nums
3.问题:
当一个数据库表过于庞大,LIMIT offset, length中的offset值过大,则SQL查询语句会非常缓慢
select * from t_table order by id limit 10000000,10
上边SQL语句表示从表t_table 中拿数据,跳过10000000行之后,拿10行
4.优化思路:
1.能不能跳过10000000条数据然后读取10条,而不是读取10000010条数据然后返回10条数据。
2.order by字段需要建立索引
改进后的SQL语句如下:
select * from t_table where id >= ( select id from t_table order by id limit 10000000,1 ) limit 10
注:假设id是主键索引,那么里层走的是索引,外层也是走的索引,所以性能大大提高
5.总结
当一个数据库表过于庞大,LIMIT offset, length中的offset值过大,则SQL查询语句会非常缓慢,需增加order by,并且order by字段需要建立索引。
如果使用子查询去优化LIMIT的话,则子查询必须是连续的,某种意义来讲,子查询不应该有where条件,where会过滤数据,使数据失去连续性。
如果查询的记录比较大,并且数据传输量比较大,比如包含了text类型的field,则可以通过建立子查询。
来源:CSDN
作者:飘雪的泡泡
链接:https://blog.csdn.net/u013531928/article/details/104530647