MySQL之主键索引排序失效问题
作者:DayDayUp丶 发布时间:2024-01-19 10:38:53
标签:MySQL,主键,索引,排序
主键索引排序失效
环境:MySQL8
有一张用户信息表user_info
,建表DDL如下:
CREATE TABLE `user_info` (
`id` int(11) NOT NULL COMMENT '用户编号',
`age` int(11) NOT NULL COMMENT '用户年龄',
PRIMARY KEY (`id`),
KEY `idx_age` (`age`) USING BTREE COMMENT '年龄索引'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
只有两列,第一列用户编号id
做主键,第二列用户年龄age
有一个普通索引idx_age
。
现在初始化几行数据
INSERT INTO `user_info` (`id`,`age`) VALUES(1,1),(5,3),(7,8),(11,12);
查一下所有记录
接着往这个表里插入一行数据(6,1)
,猜测一下这行数据最终会插入在什么位置?
可能大部分人都会认为插入在(5,3)
和(7,8)
之间,因为id=6的话,5<6<7。
但是再次查看结果,发现并符合预期,而是插入在了(1,1)
和(5,3)
之间:
看起来效果就像是age
变为了主键,根据age
默认排序了,或者说主键索引排序失效。
这是因为在MySQL底层实现中,对于像user_info
这种特殊的表,有特殊的处理方式。这张user_info
表的特殊点在于,只有两列,一列是主键,另一列也有索引。
这时候非主键的age这一列就是一个覆盖索引
,因为age的索引可以查到所有字段。
MySQL内部会认为访问数据的时候,覆盖索引的效率比主键索引高,所以维护默认的排序会优先根据覆盖索引列来进行。
查看一下执行计划
type=index
,代表只遍历了索引树;key=idx_age
,代表真正用到了索引;Extra=Using index
,代表覆盖索引生效,在索引树中就可以查到所需数据,避免了回表扫描表数据文件。
来源:https://blog.csdn.net/songzehao/article/details/124069848


猜你喜欢
- 数组使用简介原文地址:30 Days of Mootools 1.2 Tutorials - Day 3 - Intro to Using
- 作用:export和export default实现的功能相同,即:可用于导出(暴露)常量、函数、文件、模块等,以便其他文件调用。区别:1、
- 一、实战场景Flask 框架实现用户的注册,登录和登出。二、主要知识点flask_login 插件使用SQLAlchemy 基础操作用户基础
- 1.依次安装python2和python3,并添加到系统环境变量中2.找到python3的安装目录,一般在C:\Users\Administ
- pycharm程序界面一般有很多子窗口,如图1所示。pycharm项目视图-运行窗口图1 Pycharm子窗口如果你发现某些子窗口不见了,图
- 什么是主键?主键是表中唯一标识该表中每个元组(行)的列。主键对表实施完整性约束。表中只允许使用一个主键。主键不接受任何重复值和空值。表中的主
- 1, 创建pytorch 的Tensor张量:torch.rand((3,224,224)) #创建随机值的三维张量,大小为(3,224,2
- 前言:我们知道,python代码文件大多数都是py类型。那么,能不能使用txt文件存储我们的代码呢?python这么强大的语言当然可以做大,
- 这篇文章主要介绍了给Python初学者的一些编程技巧,皆是基于基础的一些编程习惯建议,需要的朋友可以参考下交换变量x = 6y = 5 x,
- 注意: 在搭建网络的时候用carpool2D的时候,让高度和宽度方向不同池化时,用如下:nn.MaxPool2d(kernel_size=2
- 如何用通过Web访问OLAP数据? <% Set Conn=Server.CreateObject(″A
- 本文详细描述使用Django 的ORM框架操作PostgreSQL数据库删除不生效问题的定位过程及解决方案,并总结使用ORM框架操作数据库不
- json.dumps将一个Python数据结构转换为JSONimport jsondata = { 'na
- 场景go 如果频繁地创建、销毁对象(比如 http 服务的 json 对象,日志内容等),会对 GC 造成压力。比如下面的 Log 函数,在
- 在实际开发中,无论是做PC端、WebApp端还是微信公众号等类型的项目的时候,或多或少都会涉及到微信相关的开发,最近公司项目要求实现微信网页
- 都知道django每次请求都会连接数据库和释放数据库连接。Django为每个请求使用新的数据库连接。一开始这个方法行得通。然而随着服务器上的
- LMDB的全称是Lightning Memory-Mapped Database(快如闪电的内存映射数据库),它的文件结构简单,包含一个数据
- 等了好久终于等到了V8,赶紧测测效果,放张官网的比对图官网链接https://github.com/ultralytics/ultralyt
- <script type="text/vbscript">
- 我们可以利用windows提供的api函数来实现对系统键盘事件和鼠标事件的监听,主要利用的是SetWindowsHookEx函数,这个函数可