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再做过滤。
解决方案
-
给出大致范围,增加确定范围的条件,避免offset。
select film_id,description from sakila.film where film_id > 10000 order by title limit 5;
在大表做分页时也会这么做,不提供总页数和跳页功能,只有下一页按钮,提高分页效率。
-
子查询减少回表
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