MYSQL LIMIT

原文地址:http://www.zhenhua.org/article.asp?id=200

1.MYSQL的优化是非常重要的。其他最常用也最需要优化的就是limit。mysql的limit给分页带来了极大的方便,但数据量一大的时候,limit的性能就急剧下降。
同样是取10条数据

select * from yanxue8_visit limit 10000,10和select * from yanxue8_visit limit 0,10

就不是一个数量级别的。

网上也很多关于limit的五条优化准则,都是翻译自mysql手册,虽然正确但不实用。今天发现一篇文章写了些关于limit优化的,很不错。
文中不是直接使用limit,而是首先获取到offset的id然后直接使用limit size来获取数据。根据他的数据,明显要好于直接使用limit。这里我具体使用数据分两种情况进行测试。(测试环境win2033+p4双核(3GHZ) +4G内存 mysql 5.0.19)

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越大,后者越优。

 

 

<think>我们正在讨论MySQLLIMIT子句的用法。根据用户提供的引用,我们可以总结出LIMIT的基本用法和几个常见场景。 引用[1][2][4][5]都提到了LIMIT的两种常见形式: 1. LIMIT count: 返回前count条记录 2. LIMIT offset, count: 从第offset条记录开始(偏移量,从0开始计数),返回count条记录。或者另一种写法:LIMIT count OFFSET offset 另外,引用[2][4]还提到,当第二个参数为-1时,表示从偏移量开始直到最后的所有记录(但注意:MySQL官方文档并不支持负数,实际使用中负数会报错,所以这个用法可能是错误的或者不支持的,应避免使用)。 引用[3]则展示了一个利用子查询和LIMIT进行高效分页的技巧。 因此,我们回答的重点应该是: 1. 基本用法:包括两种形式,以及参数的含义。 2. 分页查询的应用。 3. 可能提到的高效分页方法(如引用[3]的方法)。 注意:用户提供的引用中有重复(引用[2]和引用[4]内容几乎一样),我们以官方文档为准,但这里我们根据引用内容进行总结。 另外,需要提醒用户,偏移量较大时,使用LIMIT offset, count可能会效率低下,因为MySQL需要扫描offset+count条记录。引用[3]提供了一种通过索引覆盖扫描来提高效率的方法。 我们将按照以下结构组织回答: 一、LIMIT子句的基本语法 二、常用示例 三、分页查询实现 四、高效分页技巧(避免大偏移量) 五、注意事项 注意:在回答中,我们不会直接使用引用中的代码,而是整理成更清晰的形式,并在适当的地方标注引用。 开始回答:</think>### MySQL LIMIT 用法详解 `LIMIT` 是 MySQL 中用于控制查询结果返回行数的关键子句,特别适用于分页查询和结果限制场景。以下是其核心用法和示例: --- #### 一、基本语法 ```sql SELECT 列名 FROM 表名 LIMIT [offset,] row_count; ``` - **offset**:起始行偏移量(从0开始计数) - **row_count**:返回的最大行数 --- #### 二、核心用法示例 1. **限制返回行数** 返回前 N 条记录: ```sql -- 返回前 5 条记录 SELECT * FROM products LIMIT 5; ``` 等价于: ```sql SELECT * FROM products LIMIT 0,5; -- 偏移量0 + 5行[^2][^5] ``` 2. **分页查询** 跳过 M 条记录,返回后续 N 条: ```sql -- 跳过前10条,返回第11-20条(共10条) SELECT * FROM orders LIMIT 10, 10; ``` 等效语法(MySQL 8.0+): ```sql SELECT * FROM orders LIMIT 10 OFFSET 10; -- 更清晰的语义[^1] ``` 3. **获取最后几条记录** ```sql -- 获取最后5条记录(需配合ORDER BY) SELECT * FROM logs ORDER BY id DESC LIMIT 5; ``` --- #### 三、高效分页技巧 当处理大数据量分页时,避免性能问题: ```sql -- 高效分页(利用索引覆盖扫描) SELECT * FROM articles WHERE id >= ( SELECT id FROM articles ORDER BY id LIMIT 10000, 1 -- 先定位起始ID ) LIMIT 10; -- 再取目标数据[^3] ``` > **原理**:子查询先通过索引定位起始ID,避免全表扫描。 --- #### 四、特殊场景处理 1. **动态偏移量计算** ```sql -- 计算每页20条的第三页数据 SET @page = 3, @rows_per_page = 20; SELECT * FROM users LIMIT (@page - 1) * @rows_per_page, @rows_per_page; ``` 2. **与 ORDER BY 结合** ```sql -- 按价格降序取前10个最贵商品 SELECT * FROM products ORDER BY price DESC LIMIT 10; ``` --- #### 五、注意事项 1. **偏移量陷阱**:`LIMIT 10000, 10` 会扫描前10010行再返回10行,大数据量时需优化[^3] 2. **与 WHERE 执行顺序**:`LIMIT` 在 `WHERE` 过滤后执行 3. **负值限制**:`LIMIT -1` 语法在 MySQL 8.0 后已废弃[^4] 4. **结果确定性**:未指定 `ORDER BY` 时,返回行顺序不固定 > **最佳实践**:分页查询必须配合 `ORDER BY` 保证结果顺序一致。 --- ### 分页查询示例 ```sql -- 电商商品分页(每页20条,按上架时间倒序) SELECT product_id, name, price FROM products WHERE category = 'electronics' ORDER BY listed_time DESC LIMIT 40, 20; -- 第三页数据(跳过前40条,取20条)[^1][^2] ``` 通过合理使用 `LIMIT`,可显著提升大数据量查询效率,特别是在 Web 应用的列表展示场景中[^5]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值