Mysql 查询主键未指定排序时的默认排序问题
正文
跑批量任务需要分批按顺序把主键取出来,语句如下:
SELECT id FROM foo.bar LIMIT 10 OFFSET 0
+-----+
| id |
+-----+
| 109 |
| 13 |
| 14 |
| 15 |
| 128 |
| 129 |
| 130 |
| 190 |
| 226 |
| 227 |
+-----+
复制代码
发现虽然用主键去查,但结果没有按照主键排序。
查询*试试
SELECT * FROM foo.bar LIMIT 10 OFFSET 0
+----+-------+---+
| id | a | b |
+----+-------+---+
| 1 | 24274 | 0 |
| 2 | 24274 | 0 |
| 3 | 24274 | 0 |
| 4 | 24274 | 0 |
| 5 | 24274 | 0 |
| 6 | 24274 | 0 |
| 7 | 24274 | 0 |
| 8 | 24274 | 0 |
| 9 | 24274 | 0 |
| 10 | 24274 | 0 |
+----+-------+---+
复制代码
排序按照主键。
查看执行计划,结果如下:
EXPLAIN SELECT * FROM foo.bar LIMIT 10 OFFSET 0 \G
***************************[ 1. row ]***************************
id | 1
select_type | SIMPLE
table | bar
partitions | <null>
type | ALL
possible_keys | <null>
key | <null>
key_len | <null>
ref | <null>
rows | 211
filtered | 100.0
Extra | <null>
复制代码
发现select *没走索引,使用了全表扫描,因此顺序为主键顺序。
EXPLAIN SELECT id FROM foo.bar LIMIT 10 OFFSET 0 \G
***************************[ 1. row ]***************************
id | 1
select_type | SIMPLE
table | bar
partitions | <null>
type | index
possible_keys | <null>
key | idx_a
key_len | 8
ref | <null>
rows | 211
filtered | 100.0
Extra | Using index
复制代码
而select id并没有用到聚簇索引。innodb二级索引会自动添加主键作为索引列最后一项,使用该索引也能做到覆盖查询。查询优化器使用该索引,导致返回的顺序不符合预期。
SELECT a,id FROM foo.bar LIMIT 10 OFFSET 0
+------+-----+
| a | id |
+------+-----+
| 1004 | 109 |
| 1823 | 13 |
| 1823 | 14 |
| 1823 | 15 |
| 1823 | 128 |
| 1823 | 129 |
| 1823 | 130 |
| 1823 | 190 |
| 1823 | 226 |
| 1823 | 227 |
+------+-----+
复制代码
发现果然之前select id用的是a的索引,并且是按照a,id的顺序排序。
SELECT id FROM foo.bar FORCE INDEX(PRI) LIMIT 10 OFFSET 0
+----+
| id |
+----+
| 1 |
| 2 |
| 3 |
| 4 |
| 5 |
| 6 |
| 7 |
| 8 |
| 9 |
| 10 |
+----+
复制代码
强制使用主键索引,果然没问题了。
explain SELECT id FROM boss_business.boss_block_refund_order order by id LIMIT 10 OFFSET 0 \G
***************************[ 1. row ]***************************
id | 1
select_type | SIMPLE
table | boss_block_refund_order
partitions | <null>
type | index
possible_keys | <null>
key | PRIMARY
key_len | 8
ref | <null>
rows | 10
filtered | 100.0
Extra | Using index
复制代码
或者使用order by id引导查询优化器使用主键索引也可以。
另外需要注意,MyISAM引擎表在没有任何的删除、修改操作下,执行select 不带order by,那么会按照插入顺序进行排序。因为使用MyISAM存储引擎的表会把索引信息另外存储到一个称为索引文件的另一个文件中。总之Mysql的查询优化器一定会倾向于使用最优的方式。
参考链接
- MySQL 默认排序真的是按主键来排序的吗
- mysql默认的排序方式
Mysql 查询主键未指定排序时的默认排序问题相关推荐
- mysql 查询主键和主键列,查询Mysql表名、主键、列名
Mysql有几个内部表,存放schema,表名,主键,索引,列名等信息. 此次做数仓迁移,用到这些,顺手整理一下: select t.table_schema,t.table_name,concat( ...
- mysql查询主键sql语句_MySQL数据库-表操作-SQL语句(一)
1. 数据库操作与存储引擎 1.1 数据库和数据库对象 数据库对象:存储,管理和使用数据的不同结构形式,如:表.视图.存储过程.函数.触发器.事件等. 数据库:存储数据库对象的容器. 数据库分两种 ...
- mysql 查询主键 删除数据_MySQL--03(增删改查主键)
插入数据 格式 insert into 表名(字段名1,字段名2,字段名3.....)values(值1,值2,值3...); 另外一种形式 insert into 表名 values(字段1的值,字 ...
- mysql insert 主键冲突_insert 时防止出现主键冲突错误的方法
最近几天,产品上线比较多,从内网测试库导出表的部分内容到线上也就比平时频繁多了,这时候可能会出现主键冲突: Error Code : 1062 Duplicate entry '1' for key ...
- mysql 查询主键
SELECT column_nameFROM INFORMATION_SCHEMA.`KEY_COLUMN_USAGE` WHERE table_name='表名' AND CONSTRAINT_SC ...
- MySQL 中主键的几种表设计组合的实际应用效果
了解主键.外键.索引 主键 主键的主要作用是保证表的完整.保证表数据行的唯一性质, ① 业务主键(自然主键):在数据库表中把具有业务逻辑含义的字段作为主键,称为"自然主键(Natural K ...
- mysql的主键有什么作用_mysql设置主键有什么用
mysql设置主键的作用是:1.唯一地标识表中的每一行,通过它可强制表的实体完整性:2.主要是用于其他表的外键关联,以及本记录的修改与删除. [相关学习推荐:mysql教程] mysql设置主键的作用 ...
- MySQL中主键的选择与磁盘性能
偶然看到了"Fotolog: Scaling the World\'s Largest Photo Blogging Community",才发现很多数据库的优化其实道理都很简单, ...
- Mysql中主键和外键和索引
Mysql中主键和外键和索引 1.主键和外键是什么 学生表(学号,姓名,性别,班级) 其中每个学生的学号是唯一的,学号就是一个主键 课程表(课程编号,课程名,学分) 其中课程编号是唯一的,课程编号就是 ...
最新文章
- Git学习系列之Git基本操作克隆项目(图文详解)
- 看到OSC有一期是:“OSChina 第 37 期高手问答 —— 消息队列服务”
- 死磕Java并发:J.U.C之阻塞队列:PriorityBlockingQueue
- ExtJs UI框架学习三
- Rhel7 设置目录权限,acl权限
- python图形绘制库turtle中文开发文档及示例大全【最详细、连结果图都有,gif格式的!】
- Factorials 阶乘
- 小程序开发(6)-之自定义导航栏
- Servlet验证码功能
- 数据库笔记09:Transact-SQL语言编程基础
- ajax 服务器怎么响应,Ajax 接收服务器返回的json响应方法
- 用Java实现文本编辑器
- Office Word 之画肘形箭头
- 大道至简 (求道于盲)
- @keyup.enter失效问题
- 二叉树的构造以及基本操作
- phpstudy+opencart搭建商城网站基本环境
- 自驾指南:元旦爱车出行全攻略
- 操作系统真象还原 第二章
- 2020年全球及中国显示驱动芯片行业产业链、出货量及竞争格局分析「图」