我中招了……没想到mysql分页查询,还藏有这种玄机……

分页查询

分页查询大家经常用到,如果各位大侠有幸参与后台管理系统第开发,对此更是轻车熟路。不管你用怎样的分页控件,一般来说,最终会回归到mysql层面,最终通过limit去分页。

举个例子:

1.先创建张表,如下:

名称

类型

说明

id

bigint(20)

主键ID

name

varchar(20)

姓名

age

int(5)

年龄

bill_date

varchar(10)

账单日

# 建表语句

CREATE TABLE `demo_user` (

`id` bigint(20) NOT NULL AUTO_INCREMENT,

`name` varchar(20) COLLATE utf8_bin NOT NULL DEFAULT '' COMMENT '姓名',

`age` int(5) NOT NULL DEFAULT '0' COMMENT '年龄',

`bill_date` varchar(15) COLLATE utf8_bin NOT NULL DEFAULT '' COMMENT '账单日',

PRIMARY KEY (`id`),

KEY `idx_bill_date` (`bill_date`) USING BTREE

) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;

2.造些数据:

id

name

age

bill_date

1

50

20200103

2

20

20200101

3

18

20200101

4

38

20200101

5

71

20200101

6

13

20200102

7

5

20200101

8

8

20200102

9

99

20200101

3.分页语句(假设每页8条数据):

# 第1页

select t.* from demo_user t

where t.bill_date like '202001%'

limit 0,8;

# 第2页

select t.* from demo_user t

where t.bill_date like '202001%'

limit 8,8;

4.分页结果

结果却很出乎意料,两次查询都没有id=1 张这条数据,而id=9 赵却出现了两次!

# 第1页

2 李 20 20200101

3 王 18 20200101

4 刘 38 20200101

5 牛 71 20200101

7 鬼 5 20200101

9 赵 99 20200101

6 神 13 20200102

8 黄 8 20200102

# 第2页

9 赵 99 20200101

问题分析

我之前认为mysql默认是按照id排序的,但从第1页但结果来看,并非如此。实际上,如果有索引参与其中,会按索引列排序。

如果sql中有limit,则凑够limit数就结束查询。(例子中凑够8条就结束)

好,就算是按索引列排序,那无非是把id=1 张 50 20200103这条数据排在最后才对,在第2页应该能看到它才合理?

嗯,理论上是这样,but……mysql的查询优化好心办了坏事。

来看看这两页查询的执行计划:

第1页的执行计划

# 第1页

EXPLAIN select t.* from demo_user t

where t.bill_date like '202001%'

limit 0,8;

id

select_type

table

partitions

type

possible_keys

key

key_len

ref

rows

filtered

Extra

1

SIMPLE

t

null

range

idx_bill_date

idx_bill_date

47

null

9

100

Using index condition

第2页的执行计划

# 第2页

EXPLAIN select t.* from demo_user t

where t.bill_date like '202001%'

limit 8,8;

id

select_type

table

partitions

type

possible_keys

key

key_len

ref

rows

filtered

Extra

1

SIMPLE

t

null

ALL

idx_bill_date

null

null

null

9

100

Using where

我们发现,第2页的查询没有用到索引。因此,第2页会默认按id排序,得到了id最大的数据——id=9 赵 99 20200101。

至于第2页为什么不走索引?嗯……俺也不知道

解决方案也很简单,加上order by强制排序就可以了。

结论

还是太年轻啊……

mysql怎么查询两页数据_mysql分页查询踩坑报告相关推荐

  1. mysql如何更新两条数据_mysql根据查询结果批量更新多条数据(插入或更新)

    mysql根据查询结果批量更新多条数据(插入或更新) 1.1 前言 mysql根据查询结果执行批量更新或插入时经常会遇到1093的错误问题.基本上批量插入或新增都会涉及到子查询,mysql是建议不要对 ...

  2. mysql的分页查询用哪个关键字_MySQL 分页查询

    一.语法和公式 1.分页语法 SELECT * FROM table LIMIT [offset,] rows | rows OFFSET offset LIMIT 子句可以被用于强制 SELECT ...

  3. mysql查找有小数点的数据_MySQL中查询中位数?

    导读:计算中位数可能是小学的内容,然而在数据库查询中实现却并不是一件容易的事.我们今天就来看看都有哪些方法可以实现. 注:本文所用MySQL版本无限制,所列题目均来源于LeetCode. LeetCo ...

  4. mysql一样的查询在我本地很快但是线上很慢_MySQL大数据量分页查询方法及其优化...

    MySQL大数据量分页查询方法及其优化 ---方法1: 直接使用数据库提供的SQL语句 ---语句样式: MySQL中,可用如下方法: SELECT * FROM 表名称 LIMIT M,N ---适 ...

  5. 千万级别数据查询优化_MySQL大数据量分页查询方法及其优化

    MySQL大数据量分页查询方法及其优化 ---方法1: 直接使用数据库提供的SQL语句 ---语句样式: MySQL中,可用如下方法: SELECT * FROM 表名称 LIMIT M,N ---适 ...

  6. MySQL 和 Oracle 大数据量分页查询方法及其优化

    MySQL大数据量分页查询方法及其优化 ---方法1: 直接使用数据库提供的SQL语句 ---语句样式: MySQL中,可用如下方法: SELECT * FROM 表名称 LIMIT M,N ---适 ...

  7. mysql读取第3条记录_sql查询(三)之分页查询

    分页查询这个内容基本上是个项目都会用的到的东西,面试也会问到的, 平常项目中老是百度用法,这些写博客来总结一下,省的老是百度. 现在主流的关系型数据的分页实现还是有点差别的,以oracle.mysql ...

  8. easyui datatable ajax 加载数据,ASP.NET easyUI--datagrid 通过ajax请求ASP.NET后台数据的分页查询...

    js前台对datagrid的定义代码,如下 mygrid = $('#mytable').datagrid({ fit: true, //自动大小 height: 'auto', rownumbers ...

  9. mysql分页查询出租房屋信息_分页查询信息(使用jdbc连接mysql数据库实现分页查询任务)...

    分页查询信息 使用jdbc连接mysql数据库实现分页查询任务 通过mysql数据库提供的分页机制,实现商品信息的分页查询功能,将查询到的信息显示到jsp页面上. 本项目时一个简单的运用eclipse ...

  10. Mysql中一千万条数据怎么快速查询

    文章来源: 学习通http://www.bdgxy.com/ 目录 普通分页查询 如何优化 偏移量大 采用id限定方式 优化数据量大问题 普通分页查询 当我们在日常工作中遇到大数据查询的时候,第一反应 ...

最新文章

  1. git 查看修改的代码行数,新增的文件以及删除的代码行数
  2. Java程序员转Android开发必读经验
  3. Boost:双图bimap分配的测试程序
  4. 春天的旁边_春天@PropertySource
  5. 隐秘攻击:恶意病毒可使智能手机加速老化
  6. window系统怎么解压tar.bz2文件
  7. 实验10.  Hadoop环境搭建
  8. Eric6与pyqt5学习笔记14 【实战5 百度贴吧离线签到工具】
  9. spring事务和加可重入锁解决库存超卖遇到的问题
  10. 知识管理,助力员工培训体系构建
  11. perl data::dumper 模块使用
  12. 深度学习-吴恩达第一课第二周课程作业
  13. WIN7 错误代码0x80070005怎么办
  14. 2022年全球与中国智能白板市场现状及未来发展趋势
  15. jQuery HTML5文件上传美化插件jQuery.filer
  16. bom树形结构 表设计_BOM模块常用表结构
  17. 进程通信概念和进程通信方式
  18. git推送被拒绝可能的原因
  19. Kafka 消息传递语义 Exactly Once(精准一次) 相关知识
  20. 【数字逻辑】学习笔记 第五章 Part3 时序逻辑电路(常用时序逻辑电路及其应用)

热门文章

  1. 李扬:2018春节港澳游(上篇:行)
  2. 【路径规划】基于matlab蚁群算法求解机器人栅格地图最短路径规划问题【含Matlab源码 1618期】
  3. 【TSP】基于matlab GUI改进的遗传算法求解旅行商问题【含Matlab源码 926期】
  4. 【TWVRP】基于matalb模拟退火算法求解带时间窗的车辆路径规划问题【含Matlab源码 160期】
  5. 机器学习为什么重要_什么是机器学习? 为什么对您的业务很重要?
  6. 从头实现linux操作系统_从头开始实现您的第一个人工神经元
  7. 提高抗打击能力_孩子遇挫折就放弃咋办?菲尔普斯法则:培养抗挫力,试试挫折演习...
  8. Firefox 将添加画中画功能
  9. 初探Windows用户态调试机制
  10. MySQL如何把A表查询出来的某个字段的数据插入到新增的字段的下面