MYSQL中limit不适用的场景

本文探讨了在MYSQL中使用LIMIT和不使用LIMIT在特定情况下的区别,通过实例分析了在查询不同数据量时的效果,特别是在LeetCode上的一个问题中,作者发现LIMIT在某些情况下可能导致查询失败。文章鼓励读者深入理解其背后的原因,并提供了数据库查询的示例。

微信公众号:关注菜鸟解说大数据
关注可了解更多的大数据相关的内容。问题或建议,请公众号留言,或者可以浏览我的优快云
如果你觉得我写的文章对你有帮助,欢迎关注和赞赏我[1]

目录

在特殊情况下使用limit和不用limit的区别

1.查得到结果的情况

2.查不到结果的情况

在特殊情况下使用limit和不用limit的区别

这是我今天在刷leetcode上的一道题时遇到的一个问题。原题地址如下:
176. Second Highest Salary
一开始我给出的答案是:

1.查得到结果的情况

1select Salary as SecondHighestSalary from  Employee order by Salary desc limit 1,1;

这时候怎么也通不过去,然后我就换了一个思路,用以下方

MySQL 中的 `LIMIT` 查询常用于分页场景,但在处理大数据量时,若未进行优化,可能导致性能下降。以下为 `LIMIT` 查询的优化技巧: ### 3.1 使用索引加速分页查询 在 `ORDER BY` 和 `WHERE` 条件中使用索引字段,可显著提升 `LIMIT` 查询的执行效率。例如: ```sql SELECT id, name FROM users WHERE status = 1 ORDER BY created_at DESC LIMIT 10; ``` 若 `created_at` 字段存在索引,则排序操作可直接利用索引完成,避免额外的文件排序(filesort)操作[^1]。 ### 3.2 避免使用 OFFSET 大偏移量 当 `LIMIT` 与 `OFFSET` 一起使用且偏移量较大时,MySQL 仍需扫描大量行再丢弃,造成性能浪费。例如: ```sql SELECT id, name FROM users ORDER BY id ASC LIMIT 10000, 10; ``` 该语句需扫描 10010 行后丢弃前 10000 行,效率较低。可改用基于上一次查询最后一条记录的 ID 来实现高效分页: ```sql SELECT id, name FROM users WHERE id > 10000 ORDER BY id ASC LIMIT 10; ``` 该方法利用索引直接定位,避免扫描大量无用记录[^2]。 ### 3.3 限制返回字段 仅选择需要的字段而非使用 `SELECT *`,减少数据传输和内存消耗。例如: ```sql SELECT id, name FROM users WHERE status = 1 ORDER BY created_at DESC LIMIT 10; ``` 相比 `SELECT *`,限定字段可降低 I/O 负载,提高查询响应速度[^3]。 ### 3.4 使用覆盖索引 若查询字段和条件字段均可被某个索引覆盖,则 MySQL 可直接从索引中获取数据,无需回表查询。例如: ```sql SELECT name FROM users WHERE status = 1 ORDER BY created_at DESC LIMIT 10; ``` 若存在联合索引 `(status, created_at, name)`,则该查询可完全命中索引,提升性能[^4]。 ### 3.5 分页缓存策略 对访问频繁的分页结果可使用缓存(如 Redis 或 Memcached)存储前几页数据,减少数据库查询压力。例如: ```sql SELECT id, name FROM users ORDER BY created_at DESC LIMIT 0, 10; ``` 将第一页数据缓存一段时间,避免重复执行相同查询[^5]。 ### 3.6 使用子查询优化深度分页 对于深度分页(如 `LIMIT 100000, 10`),可先通过子查询获取主键,再进行数据关联查询: ```sql SELECT id, name FROM users WHERE id IN ( SELECT id FROM users WHERE status = 1 ORDER BY created_at DESC LIMIT 100000, 10 ) ORDER BY created_at DESC; ``` 该方法减少扫描行数,提高查询效率[^6]。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值