前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >SQL优化之LIMIT语法, limit n,m 和 limit n有什么区别?

SQL优化之LIMIT语法, limit n,m 和 limit n有什么区别?

作者头像
Java深度编程
发布2020-06-10 16:13:25
11.9K0
发布2020-06-10 16:13:25
举报
文章被收录于专栏:Java深度编程

在某些面试题中会遇到这样的问答或笔试题:“limit 0,1 和 limit 1有什么区别?” 要准确回答这个问题就等深入明白limit一个参数和两个参数的本质区别。

limit n,m 中的第一次参数n表示的游标的偏移量,初始值为0,第二个参数m表示的是想要获取多少条数据。所以limit 0,1表示的是从第一条记录开始,只取一条即可。limit 1表示的也是只取一条数据,也就是说limit 0,1从结果上来说是等价与limit 1。如果你回答是一样的,那就错了,那么你就钻进套子里了……哈哈哈哈哈……

我们首先来说一说 limit n,m是怎么回事,首先它要获取到第一个参数游标n的位置,那么它就必须得扫描到n的位置,接着从此位置起往后取m条数据,不足m条的返回实际的数量。那么这就会有一个性能的问题,当游标的数值越来越大时性能就会越来越差。

例如:

我们先创建用户表,再使用plsql插入100万数据:

代码语言:javascript
复制
CREATE TABLE `user` (
`ID` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键',
`NAME` varchar(45) NOT NULL COMMENT '用户姓名',
`NUM` varchar(1) NOT NULL COMMENT '编号',
) COMMENT='用户表';
代码语言:javascript
复制
BEGIN 
DECLARE i INT; 
START TRANSACTION; 
SET i=0; 
WHILE i<1000000 DO 
INSERT INTO user VALUES(NULL,CONCAT('Java深度编程',i+1),i+1); 
SET i=i+1; 
END WHILE; 
COMMIT; 
END 

然后我们分别执行sql语句:

代码语言:javascript
复制
select * FROM Sys_User limit 0,10000        //耗时 0.809s
select * FROM Sys_User limit 50000,10000    //耗时 1.654s
select * FROM Sys_User limit 100000,10000   //耗时 3.509s

你会发现按上面分页执行的顺序,执行时间所消耗的cpu会越来越大,执行时间越来越长……

同样是查询10000条记录,为何这三条语句消耗的时候不一样呢?这正是因为游标的偏移量位置不同,偏移量越大,sql语句需要像下扫描的次数就越多,若取到数据的尾部就相当于全表扫描了,所以偏移量越大消耗的性能就越多。

LIMIT n 又是什么?

上面已经说过limit0,1等价与limit 1,那他们到底有啥区别呢?

没错,虽然limit 0,1 等价于limit 1,但limit 100,1并不等价于limit 1。其原理也就是上面所说的油表的偏移量问题所带来的性能消耗,limit 100,1 需要先全表扫描到第100条之后再取一条,而limit 1只需要扫描到第一条就结束了。

另外limit 1的写法还可以用于提升sql性能的优化,具体是怎么做的呢?

根据我们上面创建的用户表,执行sql语句:

代码语言:javascript
复制
 SELECT * FROM user WHERE NAME=?;

假设我们上面创建的用户表的姓名是唯一的,那么该语句只会找到1条记录,但如果没有索引的情况下它会进行全表扫描,于是性能低下,但如果将sql语句改成:

代码语言:javascript
复制
SELECT * FROM user WHERE NAME=? limit 1;

这样的话就不会全表扫描,扫描到第一条就会结束了,因为适当的使用limit 1能够提升性能。但此方法对有索引的列无效,也就是说如果NAME这一列加了索引,执行以上两条sql语句效率是一样的。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-04-20,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Java深度编程 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • LIMIT n 又是什么?
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档