面试官:谈谈MySQL的limit用法、逻辑分页和物理分页
来源: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的用法。
往期:一年内容,200期Java面试题阶段汇总
解释limit
limit X,Y ,跳过前X条数据,读取Y条数据
X表示第一个返回记录行的偏移量,Y表示返回记录行的最大数目
如果X为0的话,即 limit 0, Y,相当于limit Y、
通过业务分析limit
我有一张工资表,只显示最新的_前两条记录_,同时进行员工姓名和工资提成备注查询
SELECTcue.real_name empName,zs.push_money AS pushMoney,zs.push_money_note AS pushMoneyNote,zs.create_datetime AS createTime
FROMzq_salary zs //主表
LEFT JOIN core_user_ext cue ON cue.id = zs.user_id //从表 on之后是从表的条件
WHEREzs.is_deleted = 0
AND (cue.real_name LIKE '%李%'OR zs.push_money_note LIKE '%测%'
)
ORDER BYzs.create_datetime DESC
LIMIT 2;就相当于
ORDER BYzs.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和方法就有这么大差距,可想而知上千万条的数据呢。
往期:一年内容,200期Java面试题阶段汇总
能用索引的尽量使用索引,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<Object> listObjects(int currentPage, int lines) {String sql = "SELECT * from vote_record_memory LIMIT " + (currentPage - 1) * lines + "," + lines;return null;
}
END推荐好文强大,10k+点赞的 SpringBoot 后台管理系统竟然出了详细教程!
分享一套基于SpringBoot和Vue的企业级中后台开源项目,代码很规范!能挣钱的,开源 SpringBoot 商城系统,功能超全,超漂亮!
面试官:谈谈MySQL的limit用法、逻辑分页和物理分页相关推荐
- mysql的limit和or_面试官:谈谈MySQL的limit用法、逻辑分页和物理分页
来源:blog.csdn.net/lvoelife/article/details/81943070 物理分页为什么用limit 在讲解limit之间,我们先说说分页的事情. 分页有逻辑分页和物理分页 ...
- 联合索引会创建几个索引_面试官:谈谈你对mysql联合索引的认识?
引言 这篇文章作为<面试官:谈谈你对mysql索引的认识>的续篇,我当时在写这篇的时候,考虑到篇幅问题所以略去了联合索引的内容,今天给大家补上. 本文预计分为两个部分:(1)联合索引部分的 ...
- 面试官:谈谈分库分表吧?
面试官:"有并发的经验没?" 应聘者:"有一点." 面试官:"那你们为了处理并发,做了哪些优化?" 应聘者:"前后端分离 ...
- pdo mysql limit_PHP mysql中limit用法详解(代码示例)
在MySQL中,LIMIT子句与SELECT语句一起使用,以限制结果集中的行数.LIMIT子句接受一个或两个offset和count的参数.这两个参数的值都可以是零或正整数. offset:用于指定要 ...
- mysql的limit用法、逻辑分页和物理分页
物理分页为什么用limit 在讲解limit之间,我们先说说分页的事情. 分页有逻辑分页和物理分页,就像删除有逻辑删除和物理删除.逻辑删除就是改变数据库的状态,物理删除就是直接删除数据库的记录,而逻辑 ...
- 面试官:MySQL 表设计要注意什么?
点击上方"方志朋",选择"设为星标" 做积极的人,而不是积极废人 来自公众号:孤独烟 引言 大家应该知道烟哥最近要(tiao 咳咳咳),嗯,不可描述! 随手讲其 ...
- Mysql的limit用法
在我们使用查询语句的时候,经常要返回前几条或者中间某几行数据,这个时候怎么办呢?不用担心,mysql已经为我们提供了这样一个功能. Sql代码 SELECT * FROM table LIMIT [ ...
- 征服Java面试官!mysql索引树结构
美团技术一面20分钟 晚7点,因为想到下周一才面试,我刚准备出去打个羽毛球,北京的电话就来了.面试官各种抱歉,说开会拖延了. 1.自我介绍 说了很多遍了,很流畅捡重点介绍完. 2.问我数据结构算法好不 ...
- 面试官:MySQL索引底层数据结构原理与性能调优,你能回答多少?
哈喽!大家好,我是小奇,一位不靠谱的程序员 小奇打算以轻松幽默的对话方式来分享一些技术,如果你觉得通过小奇的文章学到了东西,那就给小奇一个赞吧 文章持续更新,可以微信搜索[小奇JAVA面试]第一时间阅 ...
最新文章
- 浅谈RAID写惩罚(Write Penalty)与IOPS计算
- 不生成Android Dependencies
- C语言求两个链表的合并点的算法(附完整源码)
- 2019蚂蚁金服面试总结(Java方向)
- aws 数据库迁移_AWS Loft的数据库周
- 计算机系统的数制及转换
- Oracle给表和字段添加注释
- Python中if name main的作用
- mysql 创建和删除库_mysql入门系列:mysql创建、删除和选择数据库
- python书籍推荐-Python爬虫开发与项目实战
- 网友调侃特斯拉股价要冲向火星 马斯克:疯狂的时代
- jQuery新的事件绑定机制on()
- android module驱动编程及通信
- 江苏大学数字图像处理MATLAB人脸识别,MATLAB人脸识别代码
- win8 32位系统上如何运行校园翼讯客户端
- C语言基础:如何判断素数(质数)与合数
- 焦距、光圈和景深的关系
- 判断两个矩形是否重叠
- 微商如何通过自媒体平台进行引流
- Mac解压命令之不解压__MACOSX相关文件
热门文章
- 华为回应“锁屏广告”事件:非官方所为
- 一加7 Pro高清渲染图曝光:A+屏幕 超棒手感
- 以后外卖还可以买手机了!饿了么与上海迪信通达成合作
- 魅族再发16s预热图 3.5mm耳机接口不要了!
- 苹果面临5G困境!向三星采购碰壁 高通表态:苹果有我们电话
- Java并发编程之CountDownLatch闭锁
- java大数据组件HBase
- linux wc read,Linux 下使用 wc 统计文件夹下所有文件的代码行数(包括子目录)-Go语言中文社区...
- Android 用MediaCodec ,MediaExtractor解码播放MP4文件
- 使用STL去除std::vector自定义结构体重复项