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创建索引,这些知识应该了解)
- mysql删除数据库的命令(MySQL 线上数据库清理数据的方法)
- mysql要先下服务端再下客户端吗(解读MySQL的客户端和服务端协议)
- mysql与oracle如何直接连接(Oracle更换为MySQL遇到的问题及解决)
- mysql执行计划详细解读(详解MySQL的Seconds_Behind_Master)
- mysql根据子节点查询父节点(mysql 递归查找菜单节点的所有子节点的方法)
- mysql和mycat半主从复制项目(Linux如何使用 MyCat 实现 MySQL 主从读写分离)
- mysql 如何选择隔离级别(全面解析MySQL中的隔离级别)
- mysql语句详解(详解记录MySQL中lower_case_table_names的坑)
- 怎么用docker中的mysql连接数据库(连接docker里面的mysql失败解决方法)
- mysql 临时表
- mysql 查询都是0的值(MySQL按小时查询数据,没有的补0)
- python中怎么连接mysql(python远程连接MySQL数据库)
- django操作默认数据库(Django数据库类库MySQLdb使用详解)
- mysql利用数据库日志恢复数据(MySQL通过binlog恢复数据)
- mysql索引应该注意的地方(关于MySQL索引知识的小妙招)
- 乡村爱情15 宋晓峰怀疑自己孩子,腾飞与姜奶奶亲子鉴定出结果(宋晓峰怀疑自己孩子)
- 《乡村爱情13》开播,新版刘能以假乱真,编剧思维进入瓶颈(新版刘能以假乱真)
- 当年的 白洋淀战神 练肌肉 嘎子哥也成为行走的荷尔蒙(当年的白洋淀战神)
- 肌肉小子陈康, 亚洲巨兽 黄哲勋,哪个才是你的菜(肌肉小子陈康亚洲巨兽)
- 新闻周刊 青岛网红 赵厂长 编段子一箩筐输出快乐,陪父亲十二载勇斗病魔(新闻周刊青岛网红)
- 44岁夏雨演谋女郎爸,大其24岁却看不出,互动不怕袁泉吃醋(44岁夏雨演谋女郎爸)
热门推荐
- php新建文件夹代码(php新建文件的方法实例)
- dedecms后台账号(dedecms实现首页顶部会员登陆框的方法)
- sqlparameter的用法介绍
- thinkphp5访问路径(thinkphp5修改view到根目录实例方法)
- php字符串教程学习(php学习笔记之字符串常见操作总结)
- vue怎么实现输入框(vue车牌输入组件使用方法详解)
- sql server 进阶教程(SQL Server游标的介绍与使用)
- sqlserver2016安装教程(SQL server 2016 安装步骤图文教程)
- pythonpandas操作拆分excel(Python使用pandas和xlsxwriter读写xlsx文件的方法示例)
- sqlserver数据库实时同步(SQL Server实时同步更新远程数据库遇到的问题小结)
排行榜
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9