昨天的美团面试题:谈谈MySQL的limit用法逻辑分页和物理分页
Posted 程序员老鬼
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了昨天的美团面试题:谈谈MySQL的limit用法逻辑分页和物理分页相关的知识,希望对你有一定的参考价值。
来源:blog.csdn.net/lvoelife/article/details/81943070
物理分页为什么用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文件的属性:
解释limit
limit X,Y ,跳过前X条数据,读取Y条数据
-
X表示第一个返回记录行的偏移量,Y表示返回记录行的最大数目 -
如果X为0的话,即 limit 0, Y,相当于limit Y、
-
我有一张工资表,只显示最新的_前两条记录_,同时进行员工姓名和工资提成备注查询
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
-
分析一
-
分析二
SELECT * FROM vote_record_memory vrm WHERE vrm.id >= 3600000 LIMIT
20000 受影响的行: 0 时间: 0.196s
limit物理分页
-- 首页
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;
/**
* @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;
}
欢迎加入程序员交流群
鬼哥我创了几个技术交流群,大家在群里面都是九分聊技术、一分聊风雪~
如果你没有加群,那就赶紧扫描下方二维码、添加我的微信,我拉大家进群,记得备注:城市 + 昵称 + 技术方向 哦!
往期推荐
以上是关于昨天的美团面试题:谈谈MySQL的limit用法逻辑分页和物理分页的主要内容,如果未能解决你的问题,请参考以下文章