`

sql的limit

 
阅读更多
一、基本
SQL的limit语法的如以下形式
SELECT * FROM table  LIMIT [offset,] rows | rows OFFSET offset
 当省略offset的时候,offset作为0处理,表示提取查询到的前rows条数据;
 当offset>=0时候,表示提取查询到的offset开始的rows条数据;此时如果rows<0表示提取查询到的offset开始的所有数据
 当offset<0的时候,表示提取查询到的除出后rows条数据的所有数据,即剔除last row-rowslast rows之间的-rows条数据
 另外,如果rows大于实际查询的数据条数,则取rows为实际查询的数据条数。
二、实例
实例1
 检索记录行 6-15
SELECT * FROM table LIMIT 5,10; 
为了检索从某一个偏移量到记录集的结束所有的记录行,可以指定rows参数为 -1: 
实例2
检索记录行 96-last
SELECT * FROM table LIMIT 95,-1; 
 如果只给定 rows 参数,它表示前rows 条数据;换句话说,LIMIT n 等价于 LIMIT 0,n
 实例3
检索前 5 个记录行
SELECT * FROM table LIMIT 5;     
实例4
返回第6-15行数据
select * from table LIMIT 5,10; 
select * from table LIMIT 5; 
select * from table LIMIT 0,5; 
实例5
返回0到last row-rows的数据
select * from class limit 10 , -1
select * from class limit -1 OFFSET 10
假如现在class表中有100条数据,则返回的是0开始的90条数据,即0到(100-10
三、性能
3.1、基本
1、offset比较小的时候。
select * from yanxue8_visit limit 10,10
多次运行,时间保持在0.0004-0.0005之间
Select * From yanxue8_visit Where vid >=(
Select vid From yanxue8_visit Order By vid limit 10,1
) limit 10
多次运行,时间保持在0.0005-0.0006之间,主要是0.0006
结论:偏移offset较小的时候,直接使用limit较优。这个显然是子查询的原因。
2、offset大的时候。
select * from yanxue8_visit limit 10000,10
多次运行,时间保持在0.0187左右
Select From yanxue8_visit Where vid >=(
Select vid From yanxue8_visit Order By vid limit 10000,1
) limit 10
多次运行,时间保持在0.0061左右,只有前者的1/3。可以预计offset越大,后者越优。
3.2、性能优化:
方案1.
Select * From cyclopedia Where ID>=(
Select Max(ID) From (
 Select ID From cyclopedia Order By ID limit 90001
) As tmp
) limit 100;
方案2.
Select * From cyclopedia Where ID>=(
Select Max(ID) From (
 Select ID From cyclopedia Order By ID limit 90000,1
) As tmp
) limit 100;
同样是取90000条后100条记录,第1句快还是第2句快?
第1方案是先取了前90001条记录,取其中最大一个ID值作为起始标识,然后利用它可以快速定位下100条记录
第2方案择是仅仅取90000条记录后1条,然后取ID值作起始标识定位下100条记录
第1方案执行结果.100 rows in set (0.23) sec
第2方案执行结果.100 rows in set (0.19) sec
很明显第2方案胜出.因为这里ID主键,所以不会去做全表扫描,而是直接返回limit offset+length条记录,这样看来limit比起MS-SQL的Top性能还是要提高不少的.
其实第2个方案完全可以简化成
Select * From cyclopedia Where ID>=(
Select ID From cyclopedia limit 90000,1
)limit 100;
直接利用第90000条记录的ID,不用经过Max运算,这样做理论上效率因该高一些,但在实际使用中几乎看不到效果,因为本身定位ID返回的就是1条记录,Max几乎不用运作就能得到结果,但这样写更清淅明朗,省去了画蛇那一足.
  可是,既然MySQL有limit可以直接控制取出记录的位置,为什么不干脆用Select * From cyclopedia limit 90000,1呢?岂不更简洁?
这 样想就错了,试了就知道,结果是:1 row in set (8.88) sec,怎么样,够吓人的吧。Select * 最好不要随便用,要本着用什么,选什么的原则, Select的字段越多,字段数据量越大,速度就越慢. 另外,第2方案中,ID主键,所以不会去做全表扫描,而是直接返回limit offset+length条记录。
 
第1种方案同样可用于MS-SQL,而且可能是最好的.因为靠主键ID来定位起始段总是最快的.
Select Top 100 * From cyclopedia Where ID>=(
Select Top 90001 Max(ID) From (
 Select ID From cyclopedia Order By ID
) As tmp
)
但不管是实现方式是存贮过程还是直接代码中,瓶颈始终在于MS-SQL的TOP总是要返回前N个记录,这种情况在数据量不大时感受不深,但如果成百上千万,效率肯定会低下的.相比之下MySQL的limit就有优势的多,执行:
Select ID From cyclopedia limit 90000
Select ID From cyclopedia limit 90000,1
的结果分别是:
90000 rows in set (0.36) sec
1 row in set (0.06) sec
而MS-SQL只能用Select Top 90000 ID From cyclopedia 执行时间是390ms,执行同样的操作时间也不及MySQL的360ms.
分享到:
评论

相关推荐

    java代替sql limit函数

    在Java中,我们可以采取其他策略来替代SQL的`LIMIT`,以提高效率。 首先,我们需要了解分页的基本概念。分页是将查询结果分成若干页,每次只加载一页的数据,以减轻服务器负担并提高用户体验。在Java中,我们可以...

    java笔记\Oracle里sql不能用limit的处理

    Java笔记--Oracle中SQL不能用Limit的处理 在Java开发中,我们经常需要对数据库进行分页查询,但是Oracle数据库不支持Limit关键字,那么如何在Oracle中实现分页查询呢?下面,我们将详细介绍Oracle中SQL不能用Limit...

    limit传参的使用方法

    1. **LIMIT子句**:`LIMIT`是SQL语言中的一个关键词,用于限制查询结果的数量。其基本语法为: ```sql SELECT * FROM table_name LIMIT [起始位置], [记录数目]; ``` 其中,`[起始位置]`默认为0,表示从第一条...

    查询前几条记录

    在SQL语言中,有一个非常常见的方法来实现这一需求,那就是使用`LIMIT`关键字。`LIMIT`用于限制查询返回的结果集数量。在MySQL中,如果我们要查询前N条记录,可以这样写: ```sql SELECT * FROM 表名 LIMIT N; ``` ...

    mysql limit两个参数的四种用法

    MySQL中的`LIMIT`子句是查询结果集控制的关键部分,特别是在处理大数据量时,它能够有效地帮助我们获取所需的数据片段,而不是返回整个结果集。在MySQL中,`LIMIT`可以接受一个或两个参数,用于限制返回的记录数或...

    MySQL查询优化:连接查询排序limit(join、order by、limit语句)介绍

    在MySQL查询优化中,连接查询(join)与排序(order by)和限制返回结果的数量(limit)是常见的操作,但当它们结合在一起时,可能会导致性能下降。这个问题在标题和描述中已经阐述得很清楚,主要涉及到如何高效地...

    Amysql(AMS) v1.5.0107

    AMS-易用安全高效的MySQL管理系统。...05) 易用 友好的数据分页展现,解决PHPMYADMIN SQL LIMIT 10000或关联查询数据量过大加载显示不佳问题。07) 其它: 支持用户扩展开发、良好架构,简单安全易用,等……

    AMS v1.0 MySQL数据库管理系统.rar

    Amysql - AMS简介 01) 高效: 应用AMP-PHP框架... 06) 友好: 友好的数据分页展现,解决PHPMYADMIN SQL LIMIT 10000或关联查询数据量过大加载显示不佳问题。 07) 其它: 支持用户扩展开发、良好架构,简单安全易用,等……

    如何在SQL Server中实现 Limit m,n 的功能

    在MySQL中,可以用 Limit 来查询第 m 列到第 n 列的记录,例如: 代码如下:select * from tablename limit m, n但是,在SQL Server中,不支持 Limit 语句。怎么办呢?解决方案:虽然SQL Server不支持 Limit ,但是它...

    Hibernate分页查询原理解读

    1. **基于SQL LIMIT关键字的分页**:这种方式适用于支持LIMIT关键字的数据库,如MySQL。 2. **基于ROWNUM的分页**:这种方式主要针对Oracle等不支持LIMIT关键字的数据库。 #### 三、Hibernate分页查询实现原理 ###...

    leecode-数据库题(全).pdf

    文件中虽然没有直接涉及,但是提到了DISTINCT函数,这是SQL中用于返回唯一不同值的函数,此外,在MySQL中创建函数的示例也暗示了SQL中函数的使用,如ORDER BY和LIMIT等。 总结以上知识点,我们了解到在处理数据库...

    模拟mysql的limit字段的sql处理函数

    SQL数据库不支持limit语法,利用逻辑处理函数模拟出来的思路,具体可照此改造。

    MySQL管理系统 AMS v1.5.0107

    06) 友好: 友好的数据分页展现,解决PHPMYADMIN SQL LIMIT 10000或关联查询数据量过大加载显示不佳问题。 07) 其它: 支持用户扩展开发、良好架构,简单安全易用,等 AMS 1.5.0107更新: 1、增加MySQL用户权限...

    PHP中数据列表分页方法研究

    它通过SQL语句中的LIMIT关键字来限制查询结果的数量,并结合OFFSET参数跳过指定数量的记录。 **实现代码示例**: ```php $sql = "SELECT * FROM table_name LIMIT $offset, $page_size"; $result = mysqli_query($...

    标准SQL和transact-sql之比较学习

    例如,T-SQL使用TOP关键字来限制返回的行数,而标准SQL则使用LIMIT。另外,T-SQL的JOIN语法略显不同,它允许在JOIN条件中使用比较运算符,而标准SQL通常要求使用ON子句。 函数方面,T-SQL提供了一些特有的函数,如...

    Oracle分页(limit方式的运用)

    其中一种常用的方法就是使用`LIMIT`子句(尽管Oracle数据库本身不直接支持标准SQL中的`LIMIT`关键字,但可以通过其他方式模拟其功能)。本文将详细介绍如何在Oracle中实现类似`LIMIT`的关键字来完成分页查询。 ####...

    MySQL管理系统 AMS v1.5.0107.zip

    06) 友好: 友好的数据分页展现,解决PHPMYADMIN SQL LIMIT 10000或关联查询数据量过大加载显示不佳问题。 07) 其它: 支持用户扩展开发、良好架构,简单安全易用,等   AMS 1.5.0107更新: 1、增加MySQL用户权限...

    MYSQL管理系统(AMS) 1.5.0107.zip

    MYSQL管理系统(AMS) 1.5.0107 更新内容: ...06) 友好: 友好的数据分页展现,解决PHPMYADMIN SQL LIMIT 10000或关联查询数据量过大加载显示不佳问题。 07) 其它: 支持用户扩展开发、良好架构,简单安全易用,等……

    php分页代码

    根据当前页数计算SQL LIMIT子句的起始位置,然后构建SQL查询语句,从数据库中检索对应页的数据,并按日期降序排序。这一步是实现分页的核心,通过LIMIT子句限制返回的行数,从而实现分页效果。 #### 5. 数据展示与...

    php分页类(通用)

    - **生成SQL语句**:根据当前页码和每页条数生成相应的SQL LIMIT子句,用于数据库查询。 ``` public function getLimitSQL() { $offset = ($this-&gt;currentPage - 1) * $this-&gt;perPage; return "LIMIT $offset, ...

Global site tag (gtag.js) - Google Analytics