MySQL之主键索引排序失效问题

 更新时间:2022年12月27日 14:22:57   作者:DayDayUp丶  
这篇文章主要介绍了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,代表覆盖索引生效,在索引树中就可以查到所需数据,避免了回表扫描表数据文件。

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

您可能感兴趣的文章:

相关文章

  • ubuntu 16.04下mysql5.7.17开放远程3306端口

    ubuntu 16.04下mysql5.7.17开放远程3306端口

    这篇文章主要介绍了ubuntu 16.04下mysql5.7.17开放远程3306端口的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-01-01
  • MySQL的索引你了解吗

    MySQL的索引你了解吗

    这篇文章主要为大家详细介绍了MySQL的索引,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-03-03
  • mysql删除表中某一字段重复的记录

    mysql删除表中某一字段重复的记录

    一般大家也许会碰到这个问题,大家可以参考下,讲的比较详细
    2008-07-07
  • MySQL数据库升级的一些

    MySQL数据库升级的一些"陷阱"

    这篇文章主要介绍了MySQL数据库升级需要注意的地方,帮助大家更好的理解和学习,感兴趣的朋友可以了解下
    2020-08-08
  • 一篇文章学会SQL中的递归用法(Mysql)

    一篇文章学会SQL中的递归用法(Mysql)

    这篇文章主要给大家介绍了关于如何一篇文章学会SQL中的递归用法,众所周知目前的mysql版本中并不支持直接的递归查询,但是通过递归到迭代转化的思路,还是可以在一句SQL内实现树的递归查询的,需要的朋友可以参考下
    2023-10-10
  • CentOS6.8使用cmake安装MySQL5.7.18

    CentOS6.8使用cmake安装MySQL5.7.18

    这篇文章主要为大家详细介绍了CentOS6.8使用cmake安装MySQL5.7.18的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-04-04
  • MySQL日期时间类型与字符串互相转换的方法

    MySQL日期时间类型与字符串互相转换的方法

    这篇文章主要介绍了MySQL日期时间类型与字符串互相转换的方法,文中通过代码示例和图文结合的方式给大家讲解的非常详细,对大家的学习或工作有一定的帮助,需要的朋友可以参考下
    2024-07-07
  • Win下Mysql5.6升级到5.7的方法

    Win下Mysql5.6升级到5.7的方法

    MySQL的升级方式分为两种:原地升级和逻辑升级。这两种升级方式,本质没有什么区别的,下面通过本文给大家详细介绍Win下Mysql5.6升级到5.7的方法,需要的的朋友参考下
    2017-04-04
  • 一篇文章带你了解SQL之CASE WHEN用法详解

    一篇文章带你了解SQL之CASE WHEN用法详解

    本文介绍下,在mysql数据库中,有关case when语句的用法,介绍了case when语句的基础知识,并提供了相关实例,供大家学习参考,有需要的朋友不要错过
    2021-08-08
  • 解决Mysql:ERROR 1045 (28000):Access denied for user ‘root‘@‘localhost‘ (using password: NO)的方法

    解决Mysql:ERROR 1045 (28000):Access denied for user ‘roo

    最近在我们连接数据库的时候遇到个问题,感觉还挺容易遇到的,所以总结下,这篇文章主要给大家介绍了关于解决Mysql:ERROR 1045 (28000):Access denied for user ‘root‘@‘localhost‘ (using password: NO)的方法,需要的朋友可以参考下
    2022-06-06

最新评论