mysqlorder工作原理(详解Mysql order by与limit混用陷阱)
类别:数据库 浏览量:968
时间:2021-10-06 01:30:20 mysqlorder工作原理
详解Mysql order by与limit混用陷阱
在Mysql中我们常常用order by来进行排序,使用limit来进行分页,当需要先排序后分页时我们往往使用类似的写法select * from 表名 order by 排序字段 limt M,N。但是这种写法却隐藏着较深的使用陷阱。在排序字段有数据重复的情况下,会很容易出现排序结果与预期不一致的问题。
如表:
查询第一页跟最后一页时出现:
解决办法:
|
SELECT * FROM purchaseinfo ORDER BY actiontime,id LIMIT 0,2; |
上面的实际执行结果已经证明现实与想像往往是有差距的,实际SQL执行时并不是按照上述方式执行的。这里其实是Mysql会对Limit做优化,具体优化方式见官方文档:https://dev.mysql.com/doc/refman/5.7/en/limit-optimization.html
|
/* Navicat MySQL Data Transfer Source Server : 本地mysql8.0 Source Server Version : 80018 Source Host : localhost:3308 Source Database : baihe Target Server Type : MYSQL Target Server Version : 80018 File Encoding : 65001 Date : 2020-06-09 14:47:37 */ SET FOREIGN_KEY_CHECKS=0; -- ---------------------------- -- Table structure for purchaseinfo -- ---------------------------- DROP TABLE IF EXISTS `purchaseinfo`; CREATE TABLE `purchaseinfo` ( `id` int (11) NOT NULL AUTO_INCREMENT, `userId` int (11) DEFAULT '0' , `inout` varchar (1) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL , `money` int (11) DEFAULT NULL , `actiontime` datetime DEFAULT NULL COMMENT 'jiaoyi' , PRIMARY KEY (`id`), KEY `UserId` (`userId`) ) ENGINE=InnoDB AUTO_INCREMENT=17 DEFAULT CHARSET=utf8mb4 COLLATE =utf8mb4_0900_ai_ci; -- ---------------------------- -- Records of purchaseinfo -- ---------------------------- INSERT INTO `purchaseinfo` VALUES ( '7' , '1' , 'I' , '10000' , '2020-06-09 18:05:41' ); INSERT INTO `purchaseinfo` VALUES ( '8' , '7788' , 'O' , '20000' , '2020-06-09 18:05:15' ); INSERT INTO `purchaseinfo` VALUES ( '9' , '7788' , 'I' , '20000' , '2020-06-09 18:05:15' ); INSERT INTO `purchaseinfo` VALUES ( '10' , '7788' , 'O' , '50000' , '2020-06-09 18:05:15' ); INSERT INTO `purchaseinfo` VALUES ( '11' , '1' , 'O' , '50000' , '2020-06-09 18:05:15' ); INSERT INTO `purchaseinfo` VALUES ( '12' , '1' , 'O' , '50000' , '2020-06-09 18:05:15' ); INSERT INTO `purchaseinfo` VALUES ( '13' , '1' , 'O' , '50000' , '2020-06-09 18:05:15' ); INSERT INTO `purchaseinfo` VALUES ( '14' , '1' , 'O' , '50000' , '2020-06-09 18:05:15' ); INSERT INTO `purchaseinfo` VALUES ( '15' , '1' , 'O' , '50000' , '2020-06-09 18:05:15' ); INSERT INTO `purchaseinfo` VALUES ( '16' , '1' , 'O' , '50000' , '2020-06-09 18:05:15' ); |
到此这篇关于详解Mysql order by与limit混用陷阱的文章就介绍到这了,更多相关Mysql order by与limit混用内容请搜索开心学习网以前的文章或继续浏览下面的相关文章希望大家以后多多支持开心学习网!
原文链接:https://blog.csdn.net/weixin_37939964/article/details/106641773
您可能感兴趣
- mysql获取随机数(MySQL 生成随机数字、字符串、日期、验证码及 UUID的方法)
- docker创建mysql环境(docker上部署MySQL的示例)
- mysql访问被拒绝(nacos无法连接mysql的解决方法)
- mysql的innodb设置(修改MySQL数据库引擎为InnoDB的操作)
- mysql一次查询的过程(一篇文章弄懂MySQL查询语句的执行过程)
- apache2.4支持php5.5吗(WINDOWS下php5.2.4+mysql6.0+apache2.2.4+ZendOptimizer-3.3.0配置)
- mysql日志功能介绍(mysql日志系统的简单使用教程)
- mysql常用优化方法(理解MySQL查询优化处理过程)
- mysql8使用技巧(一篇学会MySQL 8.0 ROLE管理)
- mysql语句性能分析(聊聊MySQL的COUNT*的性能)
- 怎么查看mysql异常链接(MySQL 查看链接及杀掉异常链接的方法)
- mysql8.0如何配超时时间(解决MySQL8.0时区的问题步骤)
- mysql数据库间的连接(MySQL中表的几种连接方式)
- MySQL定时任务(EVENT事件)如何配置详解(MySQL定时任务EVENT事件如何配置详解)
- mysql怎么给查询权限(MySql设置指定用户数据库查看查询权限)
- mysql 操作日志(MySQL中的undo日志)
- 华为 联想等46家公司笔试面试题,涉及各行各业,建议收藏(联想等46家公司笔试面试题)
- ()
- ()
- 800壮士拼死拖住30万日军 八佰 的真实历史,誓与阵地共存亡(800壮士拼死拖住30万日军)
- 演员陈创,火于 哮天犬 ,颠峰于 福贵 ,现状却令人唏嘘(演员陈创火于哮天犬)
- 幼小衔接-20以内看图读数 写数 数的组成练习题(幼小衔接-20以内看图读数)
热门推荐
- ASP.NET中重载(Overload)和覆写(Override)
- tomcat服务页面打开超慢(Web服务器Tomcat高级优化)
- thinkphp5配置入口路径(ThinkPHP5.1框架数据库链接和增删改查操作示例)
- dede图片上传问题(DEDE图片集上传图片时出错显示FILEID的解决方法)
- docker常用命令详解(docker常用命令总结推荐)
- django url配置失效(解决Django生产环境无法加载静态文件问题的解决)
- 什么是mime编码(Mime类型与文件后缀对照表)
- sqlserver2019使用教程图文(SQLServer2019 数据库环境搭建与使用的实现)
- 循环查询sql server(SQL Server 树形表非循环递归查询的实例详解)
- dede编码在哪里改(dede栏目页面包屑导航最后的分隔符大于号去掉方法)