mysql limit 0,100 和limit 10000000,100 差别

本文探讨了在MySQL中,从大量数据表中使用LIMIT进行分页查询的性能问题。通过对比`LIMIT 0,100`和`LIMIT 10000000,100`的查询效率,指出后者存在明显性能下降。提出使用子查询和筛选条件作为优化方案,以提高查询速度。" 7421979,173622,Lua编程入门指南,"['脚本语言', 'Lua编程', '编程基础', '动态类型', '函数']

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

使用子查询和筛选条件能够很好地避免这个问题

首先我们有个需求,从10000000 万数据量的orders_test表里取出100条数据,至于怎么取没有要求。

表结构如下:

CREATE TABLE `orders_test` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `o_date` date DEFAULT NULL,
  `c_id` varchar(50) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=10944333 DEFAULT CHARSET=utf8

表数据量:

使用以下语句来取100条看看:

select * from orders_test order by id limit 10,100;

可以看到还是比较快的

使用以下语句试试看:

select * from orders_test order by id limit 10000000,100;

可以看到该语句用时较长

 

优化方案:

使用子查询和筛选条件能够很好地避免这个问题

select * from orders_test a where a.id >=
(select id from orders_test b where id > 9999999 ORDER BY b.id limit 1)
 limit 100
> OK
> 时间: 0.036s

这里效率有一定的提升
 

### MySQLLIMIT OFFSET 的区别 在 MySQL 查询语句中,`LIMIT` `OFFSET` 是用于控制查询结果集大小起始位置的关键字。 #### 基本定义 - **LIMIT**: 控制返回的结果数量。可以单独使用,也可以与 `OFFSET` 结合使用。当仅指定一个数值时,默认作为要获取的记录数[^3]。 - **OFFSET**: 指定跳过的记录数目。通常与 `LIMIT` 配合使用以实现分页效果。它决定了从哪一条记录开始读取数据[^5]。 #### 使用场景 对于简单的分页需求,可以直接通过设置不同的 `OFFSET` 来获取不同页面的数据: ```sql SELECT * FROM table_name LIMIT number_of_rows OFFSET start_position; ``` 例如,在用户表中从第6条数据开始取出10条记录: ```sql SELECT * FROM users LIMIT 10 OFFSET 5; -- 注意这里偏移是从0开始计数的所以实际是第六条 ``` 这种组合非常适合处理中小规模的数据集合,因为其逻辑直观易于理解[^4]。 然而,随着数据量的增长,基于 `OFFSET` 的分页方式可能会遇到性能瓶颈。特别是当 `OFFSET` 数值较大时,MySQL 必须扫描并忽略前面大量的行才能到达目标位置,这会显著增加查询时间[^2]。 #### 性能影响 为了优化大容量数据下的分页效率,建议采用其他策略代替传统的 `OFFSET` 方法。一种常见的替代方案是以某个唯一键(如主键ID)为基础构建范围条件来进行分页导航。比如: ```sql SELECT * FROM articles WHERE id > last_seen_id ORDER BY id ASC LIMIT page_size; ``` 这种方法避免了不必要的全表扫描过程,从而提高了响应速度[^1]。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值