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中date、datetime、time类型的区别
- mysql binlog模式实际使用(实例验证MySQL|update字段为相同的值是否会记录binlog)
- 深入理解mysql日志(mysql 重要日志文件汇总)
- mysql删除表数据的语句(Mysql实现定时清空一张表的旧数据并保留几条数据推荐)
- mysql随机获取数据
- mysql六大锁解析(MySQL 锁的相关知识总结)
- mysqltimestamp如何比较(为什么MySQL 使用timestamp可以无视时区问题.)
- mysql从入门到实践万字详解(mysql基础知识扫盲)
- 如何找到mysqlroot密码(WDCP管理面板忘记MYSQL ROOT密码及重置后台登录密码的方法汇总)
- mysql死锁情况(MySQL kill不掉线程的原因)
- mysql恢复数据库(MySQL 两种恢复数据的方法)
- mysql数据备份的几种方式(MySQL数据库备份过程的注意事项)
- mysql数据库事务处理(MySQL数据库事务与锁深入分析)
- mysql常用数据模型(MySQL数据库基于sysbench实现OLTP基准测试)
- mysqlsql语句的优化(MySQL优化之如何写出高质量sql语句)
- oraclemysql知识点(详解Mysql和Oracle之间的误区)
- 真牛 禹州将建成中等城市(禹州将建成中等城市)
- 被骂欺师灭祖,与郭德纲公开叫板,何云伟改名何沄伟,开始画画了(与郭德纲公开叫板)
- 相声转行影帝,被何晴抛弃,甩10年女友闪婚生子,刘威不靠谱情史(相声转行影帝被何晴抛弃)
- 岳云鹏不说相声,改行演员了 网友 快回来说相声(岳云鹏不说相声)
- 乔欣首演古装大女主,颜值演技双在线(乔欣首演古装大女主)
- 于正又推女性古装大剧 杨蓉乔欣演女配,两位女主成 重头戏(于正又推女性古装大剧)
热门推荐
排行榜
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9