MySQL的LIMIT这么差劲的吗

如题所述

对于MySQL中的LIMIT语句执行逻辑,我们需要先构建一个表t,该表包含3列:id为主键,key1为二级索引列。表中总共有1万条记录。当执行特定的SQL语句时,MySQL会使用二级索引idx_key1进行查询。此操作容易理解,因为索引是有序的,而查询目标是按照key1列排序的首条记录,MySQL只需从索引中获取第一条记录,再回表获取完整记录。

然而,当将LIMIT 1替换为LIMIT 5000, 1时,MySQL却会执行全表扫描,并进行文件排序,执行计划显示为全表扫描+文件排序。许多用户疑惑,为什么LIMIT 5000, 1不能利用二级索引idx_key1,直接扫描到第5001条二级索引记录,进行回表操作,以减少代价。

遗憾的是,MySQL的实现存在缺陷,它不会如期望那样使用二级索引来优化查询。此过程涉及MySQL内部的server层和存储引擎层交互。server层分析可执行方案,选择成本较低的执行计划,然后调用存储引擎提供的接口。假设采用方案二,即使用二级索引idx_key1执行查询,server层会向存储引擎发送请求,让其找到idx_key1索引中('a', 'b')区间的第一条记录,然后回表获取完整记录。

存储引擎InnoDB执行请求,通过索引B+树快速定位到扫描区间('a', 'b')的第一条记录,进行回表操作,返回完整记录给server层。server层进一步判断条件,如果满足则将记录发送至客户端。存储引擎继续搜索下一个记录,重复此过程直至找到第5001条记录。

MySQL处理LIMIT子句是在准备向客户端发送记录时进行的。在使用二级索引执行查询时,MySQL需要进行5001次回表操作。server层在进行执行计划分析时发现回表操作成本过高,选择全表扫描+文件排序,而非利用二级索引。

解决方法在于修改SQL语句为子查询形式,如:SELECT id FROM t ORDER BY key1 LIMIT 5000, 1。这样,子查询只关注id列,可以仅扫描二级索引idx_key1执行子查询,再根据子查询结果查找表t中的主键值,省去前5000条记录的回表操作,显著提高查询效率。

吐槽部分:MySQL在处理LIMIT语句时的实现效率问题,让人不禁期待优化器逻辑的改进。用户需要采取策略欺骗优化器,手动提升查询效率,这种体验令人费解。希望MySQL的大佬们能重新审视并优化LIMIT子句的执行逻辑,让用户在使用时拥有更加高效、直观的体验。
温馨提示:内容为网友见解,仅供参考
无其他回答

MySQL的LIMIT这么差劲的吗
吐槽部分:MySQL在处理LIMIT语句时的实现效率问题,让人不禁期待优化器逻辑的改进。用户需要采取策略欺骗优化器,手动提升查询效率,这种体验令人费解。希望MySQL的大佬们能重新审视并优化LIMIT子句的执行逻辑,让用户在使用时拥有更加高效、直观的体验。

Mysql使用limit深度分页优化
mysql使用select * limit offset, rows分页在深度分页的情况下。性能急剧下降。limit用于数据的分页查询,当然也会用于数据的截取,下面是limit的用法:1. 模仿百度、谷歌方案(前端业务控制)类似于分段。我们给每次只能翻100页、超过一百页的需要重新加载后面的100页。这样就解决了每次加载数量数据大 速度...

MySQL 查询语句的 limit, offset 是怎么实现的?
在读取数据的过程中,对于符合条件的前 offset 条记录,会直接忽略,不发送给客户端,从符合条件的第 offset + 1 条记录开始,发送 limit 条记录给客户端。所以,server 层实际上需要从存储引擎读取 offset + limit 条记录,源码里也是这么实现的,语法解析阶段,在验证了 offs...

mysqllimit查询性能问题如何优化?
在MySQL中,进行LIMIT查询优化,首先需要正确理解查询语句。此语句形式为:选择table_a表中ID大于等于子查询结果的最大ID的前10条记录。子查询部分的目的是找到大于等于目标ID的最小值。优化策略:优化主要集中在子查询和LIMIT操作的合理使用。子查询可以重构为外连接或子表查询,减少子查询执行次数。子查询...

MySQL LIMIT OFFSET分页“慢”查询优化
MySQL在处理SQL时,若查询语句包含OFFSET,MySQL将从指定行开始返回指定数量的记录。例如,OFFSET 1000表示从第1001条记录开始返回数据,返回10条记录。当使用二级索引查找时,MySQL需从索引开始扫描x+y行,即使使用了聚簇索引,MySQL同样需要扫描x+y行以找到满足条件的数据,这是LIMIT OFFSET慢的主要原因。...

谈谈MySQL的limit用法、逻辑分页和物理分页
在讨论MySQL的limit用法、逻辑分页与物理分页时,我们首先需理解分页的概念。分页分为逻辑分页与物理分页。逻辑分页涉及修改数据库状态,物理分页则直接删除数据库记录。逻辑分页在处理大量数据时可能消耗大量内存资源。例如,我们有一张表,插入了300万条数据后,转储到桌面查看SQL文件属性,可见数据庞大,对...

MySQL 使用 limit 分页会导致数据丢失、重复和索引失效
首先,出现数据缺失问题。在项目中,对歌手进行分页查询时使用limit,发现数据量减少了几十万。为解决此问题,可以对排序字段添加唯一值,如主键ID。导致数据重复的原因是MySQL内部使用优先队列进行排序时,堆排序算法是非稳定的。这意味着相同值的数据在排序后可能不保持原有的顺序,从而导致分页结果重复。对...

mysql的limit经典用法及优化
mysql低版本不支持limit offset limit offset 在mysql 以上的版本中都可以正常运行 在旧版本的mysql 中无效 limit m offset n 等价于 limit m n limit 的优化 mysql的limit给分页带来了极大的方便 但数据量一大的时候 limit的性能就急剧下降 MYSQL的优化是非常重要的 其他最常用也最需要优化的就是limit...

mysql limit 动态参数问题
那么你这个sql语句就是 limit 0, 0.2 所以只有在数据为10的倍数的时候,sql才能被正确执行 这里的limit的第二个参数,是要取出数据的条数,必须是整数 我建议你用脚本语言吧这个参数计算出来,处理正确正确之后再传入执行,或者使用mysql的取整函数 limit 0, CEIL(count(*) * 0.2)...

MySQL:为什么用limit时,offset很大会影响性能
使用limit offset rows时,当offset值较大,会显著影响查询效率。对比优化后语句,时间差异明显。具体过程如下:查询时,MySQL需要遍历300005次索引节点和聚簇索引数据,过滤掉前300000条数据,最后取出最后5条结果。这个过程中,大量随机I\/O操作集中在查询聚簇索引数据上,而这些数据最终不会出现在结果集中...

相似回答
大家正在搜