聊聊MySQL的Limit原理

limit 语法:

select * from table order by id limit m,n 

工作原理就是,服务器从存储引擎取出m+n条数据,然后丢弃掉m条数据,只保留最后的n条。

显然,当m比较大的时候,如此使用limit会造成巨大的浪费(无效的数据传输)。

原理概述

MySQL的分为两部分:Server层和引擎层(InnoDB)。

MySQL中一条SQL语句的执行是通过Server层和存储引擎层的多次交互才能得到最终结果的。而对于limit语句的处理:

MySQL是在Server层准备向客户端发送记录的时候才会去处理limit子句中的内容。

即:引擎层InnoDB已经执行查询并返回了大量的数据,随后才在Server层筛选过滤。

所以MySQL的limit查询并不是字面理解的那样:从m条后取n条;而是一次性取出来了m+n再做过滤。

解决方案

  1. 给出大致范围,增加确定范围的条件,避免offset。
select film_id,description from sakila.film where film_id > 10000 order by title limit 5;

在大表做分页时也会这么做,不提供总页数和跳页功能,只有下一页按钮,提高分页效率。

  1. 子查询减少回表
select * from demo_info d
join (select id from demo_info order by key1 limit 10000, 1) t on d.id = t.id

先用子查询,走主键查询id,这样快速高效,减少不必要的参数;再通过id关联查询,同样也是走索引。

参考

要想通过面试,MySQL的Limit子句底层原理你不可不知


原文始发于微信公众号(阿郎小哥的随笔驿站):聊聊MySQL的Limit原理

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/244145.html

(0)
小半的头像小半

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!