来源:blog.csdn.net/lvoelife/article/details/81943070

物理分页为什么用limit

在讲解limit之间,我们先说说分页的事情。

分页有逻辑分页和物理分页,就像删除有逻辑删除和物理删除。逻辑删除就是改变数据库的状态,物理删除就是直接删除数据库的记录,而逻辑删除只是改变该数据库的状态。例如

同理,逻辑分页和物理分页是有区别的

为什么逻辑分页占用较大的内存空间,比如我有一张表,表的信息是:

-- ----------------------------

-- Table structure for vote_record_memory

-- ----------------------------

DROP TABLE IF EXISTS `vote_record_memory`;

CREATE TABLE `vote_record_memory` (

`id` int(11) NOT NULL AUTO_INCREMENT,

`user_id` varchar(20) NOT NULL,

`vote_id` int(11) NOT NULL,

`group_id` int(11) NOT NULL,

`create_time` datetime NOT NULL,

PRIMARY KEY (`id`),

KEY `index_id` (`user_id`) USING HASH

) ENGINE=MEMORY AUTO_INCREMENT=3000001 DEFAULT CHARSET=utf8;

向该表中插入300万条数据后,再转储到桌面,查看转储后的SQL文件的属性:

这是多么庞大的数据,占用的内存多么可怕,为什么我们再选用数据库。这也是我们使用云服务器时,设定mysql的存储空间的大小。

我们一般不推荐使用逻辑分页,而使用物理分页。在使用物理分页的时候,就要考虑到limit的用法。

解释limit

limit X,Y ,跳过前X条数据,读取Y条数据

X表示第一个返回记录行的偏移量,Y表示返回记录行的最大数目

如果X为0的话,即 limit 0, Y,相当于limit Y、

通过业务分析limit

我有一张工资表,只显示最新的_前两条记录_,同时进行员工姓名和工资提成备注查询

SELECT

cue.real_name empName,

zs.push_money AS pushMoney,

zs.push_money_note AS pushMoneyNote,

zs.create_datetime AS createTime

FROM

zq_salary zs  //主表

LEFT JOIN core_user_ext cue ON cue.id = zs.user_id   //从表 on之后是从表的条件

WHERE

zs.is_deleted = 0

AND (

cue.real_name LIKE '%李%'

OR zs.push_money_note LIKE '%测%'

)

ORDER BY

zs.create_datetime DESC

LIMIT 2;

就相当于

ORDER BY

zs.create_datetime DESC

LIMIT 0,2;

limit的效率问题

我有一个需求,就是从vote_record_memory表中查出3600000到3800000的数据,此时在id上加个索引,索引的类型是Normal,索引的方法是BTREE,分别用两种方法查询

-- 方法1

SELECT * FROM vote_record_memory vrm  LIMIT 3600000,20000 ;

-- 方法2

SELECT * FROM vote_record_memory vrm WHERE vrm.id >= 3600000 LIMIT 20000

你会发现,方法2的执行效率远比方法1的执行效率高,几乎是方法1的九分之一的时间。

为什么方法1的效率低,而方法二的效率高呢?

分析一、

因为在方法1中,我们使用的单纯的limit。limit随着行偏移量的增大,当大到一定程度后,会出现效率下降。而方法2用上索引加where和limit,性能基本稳定,受偏移量和行数的影响不大。

分析二、

我们用explain来分析

可见,limit语句的执行效率未必很高,因为会进行全表扫描,这就是为什么方法1扫描的的行数是400万行的原因。方法2的扫描行数是47945行,这也是为什么方法2执行效率高的原因。我们尽量避免全表扫描查询,尤其是数据非常庞大,这张表仅有400万条数据,方法1和方法就有这么大差距,可想而知上千万条的数据呢。

能用索引的尽量使用索引,type至少达到range级别_,这不是我说的,这是阿里巴巴开发手册的5.2.8中要求的_

我不用索引查询到的结果和返回的时间和方法1的时间差不多:

SELECT * FROM vote_record_memory vrm WHERE vrm.id >= 3600000 LIMIT

20000 受影响的行: 0 时间: 0.196s

这也就是我们为什么尽量使用索引的原因。mysql索引方法一般有BTREE索引和HASH索引,hash索引的效率比BTREE索引的效率高,但我们经常使用BTREE索引,而不是hash索引。因为最重要的一点就是:Hash索引仅仅能满足”=”,”IN”和”<=>”查询,不能使用范围查询。

如果是范围查询,我们为什么用BTREE索引的原因。BTREE索引就是二叉树索引,学过数据结构的应该都清楚,这里就不赘述了。

limit物理分页

我们都知道limit一般有两个参数,X和Y,X表示跳过X个数据,读取Y个数据,我们就此来查询数据

如果是SQL语句来进行分页的话,我们可以看到的是:

-- 首页

SELECT * from vote_record_memory LIMIT 0,20;

-- 第二页

SELECT * from vote_record_memory LIMIT 20,20;

-- 第三页

SELECT * from vote_record_memory LIMIT 40,20;

-- 第四页

SELECT * from vote_record_memory LIMIT 60,20;

-- n页

SELECT * from vote_record_memory LIMIT (n-1)*20,20;

因而,如果是用java的话,我们就可以写一个方法,有两个参数,一个是页数,一个每页显示的行数

/**

* @description          简单的模拟分页雏形

* @author               zby

* @param currentPage    当前页

* @param lines          每页显示的多少条

* @return               数据的集合

*/

public List listObjects(int currentPage, int lines) {

String sql = "SELECT * from vote_record_memory LIMIT " + (currentPage - 1) * lines + "," + lines;

return null;

}

↓↓↓↓点击下方获取源码和教程↓↓↓↓

mysql的limit和or_面试官:谈谈MySQL的limit用法、逻辑分页和物理分页相关推荐

  1. 联合索引会创建几个索引_面试官:谈谈你对mysql联合索引的认识?

    引言 这篇文章作为<面试官:谈谈你对mysql索引的认识>的续篇,我当时在写这篇的时候,考虑到篇幅问题所以略去了联合索引的内容,今天给大家补上. 本文预计分为两个部分:(1)联合索引部分的 ...

  2. 面试官:谈谈分库分表吧?

    面试官:"有并发的经验没?"  应聘者:"有一点."   面试官:"那你们为了处理并发,做了哪些优化?"   应聘者:"前后端分离 ...

  3. 面试官:MySQL索引底层数据结构原理与性能调优,你能回答多少?

    哈喽!大家好,我是小奇,一位不靠谱的程序员 小奇打算以轻松幽默的对话方式来分享一些技术,如果你觉得通过小奇的文章学到了东西,那就给小奇一个赞吧 文章持续更新,可以微信搜索[小奇JAVA面试]第一时间阅 ...

  4. 有了这份MySQL精华总结,和面试官扯半天都没问题!

    ❝ 写在之前:不建议那种上来就是各种面试题罗列,然后背书式的去记忆,对技术的提升帮助很小,对正经面试也没什么帮助,有点东西的面试官深挖下就懵逼了. 个人建议把面试题看作是费曼学习法中的回顾.简化的环节 ...

  5. 面试官:MySQL 表设计要注意什么?

    点击上方"方志朋",选择"设为星标" 做积极的人,而不是积极废人 来自公众号:孤独烟 引言 大家应该知道烟哥最近要(tiao 咳咳咳),嗯,不可描述! 随手讲其 ...

  6. 你以为你懂MySQL索引?阿里的面试官:你还太嫩!

    相信很多人对于MySQL的索引都不陌生,索引(Index)是帮助MySQL高效获取数据的数据结构. 因为索引是MySQL中比较重点的知识,相信很多人都有一定的了解,尤其是在面试中出现的频率特别高.楼主 ...

  7. 征服Java面试官!mysql索引树结构

    美团技术一面20分钟 晚7点,因为想到下周一才面试,我刚准备出去打个羽毛球,北京的电话就来了.面试官各种抱歉,说开会拖延了. 1.自我介绍 说了很多遍了,很流畅捡重点介绍完. 2.问我数据结构算法好不 ...

  8. 【227期】面试官:MySQL 数据查询太多会 OOM 吗?

    点击上方"Java精选",选择"设为星标" 别问别人为什么,多问自己凭什么! 下方有惊喜,留言必回,有问必答! 每天 08:15 更新文章,每天进步一点点... ...

  9. 【面试题】面试官: MySQL的主从原理你说一下

    前言 mysql 主从原理是面试时候必问的面试题,被面试到的概率达到了90%,所以需要提前准备. 推荐准备指数: 五颗星 通常解法 从库生成两个线程,一个I/O线程,一个SQL线程, i/o线程去请求 ...

最新文章

  1. ffmpeg 添加水印LOGO
  2. python一行行写文件_python一行行写文件-女性时尚流行美容健康娱乐mv-ida网
  3. Educational Codeforces Round 119 (Rated for Div. 2)
  4. 大数据分布式工作流任务调度系统DolphinScheduler v1.3.4
  5. 技术周刊(2019-02-11 Serverless)
  6. 被拘捕 353 天后,三星“太子”李在镕被判缓刑当庭获释!
  7. CSS外边距合并(塌陷/margin越界)
  8. 利用PLTS将校准用的“trace”一分为二 操作指南
  9. 四种JAVA架构演进史,程序员能学会最后一种就非常厉害了,至少50k
  10. vuex获取php数据,vue+vuex+axio从后台获取数据存入vuex实现组件之间共享数据
  11. PTA 10-99 3-1-(b) 查询st1制片公司的总裁
  12. 适合程序员学习的国外网站推荐
  13. 自编小游戏(加强版)
  14. FFmpeg一些感想
  15. 在线TSV转CSV工具
  16. 反软件盗版的最佳实践
  17. 机器学习——入门知识
  18. 【STM32L系列】+NUCLEO-L011K4体验资料
  19. 基于Android O8.1的ffmpeg NDK 开发 - 2 - APP显示ffmpeg所支持协议,编解码,过滤器,格式,配置等信息
  20. 对抗机器学习系列——深度神经网络的盲点

热门文章

  1. 热敏电阻如何查表计算温度_如何为温度传感器选择正确的热敏电阻
  2. mysql迁移cassandra_使用datax迁移cassandra数据
  3. python localtime 与utc时间差5分钟_在linux中用localtime()显示的时间与实际时间不相符,不是与北京时间差8个小时,而是差15个小时...
  4. java序列化异常_Java|序列化异常StreamCorruptedException的解决方法
  5. android 时间差 秒_Android进阶之使用时间戳计算时间差
  6. cmake / target_** 中的 PUBLIC,PRIVATE,INTERFACE
  7. 英伟达显卡不同架构_英伟达新款笔记本显卡全阵容曝光:共计六款
  8. apt来安装mysql5.7,linux系统ubuntu18.04安装mysql 5.7
  9. SCARA四轴机器人丝杆花键_花键丝杆一体轴型SCARA机器人的制作方法
  10. 信息化建设规划_苏交集团施工企业信息化建设规划分享会顺利召开