热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

mysql索引不等号_MySql中不等号的一点疑问:从为什么不等号有时也会用到索引说到“覆盖索引”|学步园...

看表结构:mysqlshowcreatetables;-------------------------------------------------------

看表结构:

mysql> show create table s;

+-------+----------------------------------------------------------------------------------------------------------------------------------------+

| Table | Create Table |

+-------+----------------------------------------------------------------------------------------------------------------------------------------+

| s | CREATE TABLE `s` (

`id` int(11) DEFAULT NULL,

`score` int(11) DEFAULT NULL,

KEY `id` (`id`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8 |

+-------+----------------------------------------------------------------------------------------------------------------------------------------+

1 row in set (0.00 sec)

看查询&#xff1a;mysql> explain select count(*) from s where id<>2;

&#43;----&#43;-------------&#43;-------&#43;-------&#43;---------------&#43;------&#43;---------&#43;------&#43;------&#43;--------------------------&#43;

| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |

&#43;----&#43;-------------&#43;-------&#43;-------&#43;---------------&#43;------&#43;---------&#43;------&#43;------&#43;--------------------------&#43;

| 1 | SIMPLE | s | index | id | id | 5 | NULL | 3 | Using where; Using index |

&#43;----&#43;-------------&#43;-------&#43;-------&#43;---------------&#43;------&#43;---------&#43;------&#43;------&#43;--------------------------&#43;

1 row in set (0.00 sec)

在这个查询中&#xff0c;我们查询的是id不等于2的count(*)&#xff0c;结果explain显示用到了index。

根据以前的知识&#xff0c;我们知道&#xff0c;数据库中使用不等号是不会用到索引的。那么这里是怎么回事呢&#xff1f;

下面是我个人的理解。

这里涉及到了一个“覆盖索引”的问题。

先说一下什么是覆盖索引呢&#xff1f;其实这不是一个特定结构的索引。只是说&#xff0c;如果我们要查询的东西&#xff0c;能够直接从索引上得到&#xff0c;而不用再去表中取数据&#xff0c;那么这个使用的索引就是覆盖索引。

回到我们的问题。select count(*) from s where id<>2;由于id列上有索引&#xff0c;而这个查询在索引上完全能够做到(查找索引上id不是2的即可)。所以这里是利用了覆盖索引的思想。

------------------------------------------------

上面的 查询是用了索引的&#xff0c;再看下面这个&#xff1a;

mysql> explain select count(score) from s where id<>2;

&#43;----&#43;-------------&#43;-------&#43;------&#43;---------------&#43;------&#43;---------&#43;------&#43;------&#43;-------------&#43;

| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |

&#43;----&#43;-------------&#43;-------&#43;------&#43;---------------&#43;------&#43;---------&#43;------&#43;------&#43;-------------&#43;

| 1 | SIMPLE | s | ALL | id | NULL | NULL | NULL | 3 | Using where |

&#43;----&#43;-------------&#43;-------&#43;------&#43;---------------&#43;------&#43;---------&#43;------&#43;------&#43;-------------&#43;

1 row in set (0.01 sec)

由于score不在索引上&#xff0c;所以这里用不到覆盖索引。那么Extra列自然也不会有using index 了。

-------------------------------------------------

不等号是这个道理。like关键字也是这个道理。

使用like %%的时候&#xff0c;也会遇到即使是%在开头&#xff0c;也会有using index的场景。那也是用到了覆盖索引的思想。

在《高性能mysql》中&#xff0c;page121页第二段也提到了&#xff0c;extra中&#xff0c;出现了Using index是指用到了覆盖索引。

-----------------------------------------------------



推荐阅读
  • eclipse学习(第三章:ssh中的Hibernate)——11.Hibernate的缓存(2级缓存,get和load)
    本文介绍了eclipse学习中的第三章内容,主要讲解了ssh中的Hibernate的缓存,包括2级缓存和get方法、load方法的区别。文章还涉及了项目实践和相关知识点的讲解。 ... [详细]
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • SpringBoot uri统一权限管理的实现方法及步骤详解
    本文详细介绍了SpringBoot中实现uri统一权限管理的方法,包括表结构定义、自动统计URI并自动删除脏数据、程序启动加载等步骤。通过该方法可以提高系统的安全性,实现对系统任意接口的权限拦截验证。 ... [详细]
  • 本文介绍了数据库的存储结构及其重要性,强调了关系数据库范例中将逻辑存储与物理存储分开的必要性。通过逻辑结构和物理结构的分离,可以实现对物理存储的重新组织和数据库的迁移,而应用程序不会察觉到任何更改。文章还展示了Oracle数据库的逻辑结构和物理结构,并介绍了表空间的概念和作用。 ... [详细]
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
  • Java String与StringBuffer的区别及其应用场景
    本文主要介绍了Java中String和StringBuffer的区别,String是不可变的,而StringBuffer是可变的。StringBuffer在进行字符串处理时不生成新的对象,内存使用上要优于String类。因此,在需要频繁对字符串进行修改的情况下,使用StringBuffer更加适合。同时,文章还介绍了String和StringBuffer的应用场景。 ... [详细]
  • 电话号码的字母组合解题思路和代码示例
    本文介绍了力扣题目《电话号码的字母组合》的解题思路和代码示例。通过使用哈希表和递归求解的方法,可以将给定的电话号码转换为对应的字母组合。详细的解题思路和代码示例可以帮助读者更好地理解和实现该题目。 ... [详细]
  • 本文详细介绍了SQL日志收缩的方法,包括截断日志和删除不需要的旧日志记录。通过备份日志和使用DBCC SHRINKFILE命令可以实现日志的收缩。同时,还介绍了截断日志的原理和注意事项,包括不能截断事务日志的活动部分和MinLSN的确定方法。通过本文的方法,可以有效减小逻辑日志的大小,提高数据库的性能。 ... [详细]
  • VScode格式化文档换行或不换行的设置方法
    本文介绍了在VScode中设置格式化文档换行或不换行的方法,包括使用插件和修改settings.json文件的内容。详细步骤为:找到settings.json文件,将其中的代码替换为指定的代码。 ... [详细]
  • 本文介绍了使用Java实现大数乘法的分治算法,包括输入数据的处理、普通大数乘法的结果和Karatsuba大数乘法的结果。通过改变long类型可以适应不同范围的大数乘法计算。 ... [详细]
  • 图解redis的持久化存储机制RDB和AOF的原理和优缺点
    本文通过图解的方式介绍了redis的持久化存储机制RDB和AOF的原理和优缺点。RDB是将redis内存中的数据保存为快照文件,恢复速度较快但不支持拉链式快照。AOF是将操作日志保存到磁盘,实时存储数据但恢复速度较慢。文章详细分析了两种机制的优缺点,帮助读者更好地理解redis的持久化存储策略。 ... [详细]
  • 1,关于死锁的理解死锁,我们可以简单的理解为是两个线程同时使用同一资源,两个线程又得不到相应的资源而造成永无相互等待的情况。 2,模拟死锁背景介绍:我们创建一个朋友 ... [详细]
  • 《数据结构》学习笔记3——串匹配算法性能评估
    本文主要讨论串匹配算法的性能评估,包括模式匹配、字符种类数量、算法复杂度等内容。通过借助C++中的头文件和库,可以实现对串的匹配操作。其中蛮力算法的复杂度为O(m*n),通过随机取出长度为m的子串作为模式P,在文本T中进行匹配,统计平均复杂度。对于成功和失败的匹配分别进行测试,分析其平均复杂度。详情请参考相关学习资源。 ... [详细]
  • 开发笔记:select from具体执行相关知识介绍及案例分析
    本文由编程笔记小编整理,主要介绍了select from具体执行相关的知识,包括数据插入、查询最小rowID、查询每个重复名字的最小rowID、删除重复数据等操作,并提供了案例分析。希望对读者有一定的参考价值。 ... [详细]
  • 动态规划算法的基本步骤及最长递增子序列问题详解
    本文详细介绍了动态规划算法的基本步骤,包括划分阶段、选择状态、决策和状态转移方程,并以最长递增子序列问题为例进行了详细解析。动态规划算法的有效性依赖于问题本身所具有的最优子结构性质和子问题重叠性质。通过将子问题的解保存在一个表中,在以后尽可能多地利用这些子问题的解,从而提高算法的效率。 ... [详细]
author-avatar
拟称2502902853
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有