iis服务器助手广告广告
返回顶部
首页 > 资讯 > 数据库 >MySQL (InnoDB)在什么情况下无法使用索引
  • 207
分享到

MySQL (InnoDB)在什么情况下无法使用索引

摘要

目录1. 前置知识1.1 InnoDB 索引结构2. 什么情况下不能使用索引2.1 索引列在表达式或函数中【必】2.2 联合索引中,非最左前缀【必】2.3 联合索引中,最左前缀,但是中间有范围查询,那么范围查询后面的列都用不到索引【必】2.

MySQL (InnoDB)在什么情况下无法使用索引[数据库教程]

目录

  • 1. 前置知识
  • 2. 什么情况下不能使用索引
    • 2.1 索引列在表达式或函数中【必】
    • 2.2 联合索引中,非最左前缀【必】
    • 2.3 联合索引中,最左前缀,但是中间有范围查询,那么范围查询后面的列都用不到索引【必】
    • 2.4 join... on...,主键和外键的索引数据类型不一致【必】
    • 2.5 在无索引的列上使用了 or 那么有索引的列也用不上了【可】
    • 2.6 in 查询语句中多个值的数据类型不一致的情况,如:in (1, 2, 3, 4, "5")【必】
    • 2.7 in 语句中超过 200 个值【可】

1. 前置知识

1.1 InnoDB 索引结构

InnoDB 索引使用的数据结构是 B+ 树。

百度百科中的结构图:

技术分享图片

一个 m 阶 B+ 树的几个特点:

  1. 每个节点可能有最多 m 个子节点
  2. 除根结点外,每个结点至少有[m/2]个子女,根结点至少有两个子女
  3. 有 k 个子女的结点必有 k 个关键字

可以类比字典,通过笔画找到一个字怎么办?总不能一页一页去翻吧?当然不能。

字典的修订者会加上字笔画目录,只要查清楚字的笔画数,然后去对应的笔画目录下去找就可以了。

咦~ 怎么这个笔画下面还有这么多字?总不能一页一页去翻吧?当然不会。

找到对应的笔画数之后,目录下还有部首的目录,部首的目录是按照部首笔画数排序的,查清部首的笔画数,然后去挨个找部首就行了。

找到部首之后,就会定位到具体的字了。

当然 B+ 树和字典目录还是有很多不一样的地方,只是为了比较好理解

每次搞不懂 B+ 树的时候,可以想想小时候怎么查字典的。

2. 什么情况下不能使用索引

简单来说,我们能使用索引进行高效查询是基于索引的以下特性

  1. 多级目录
  2. 有序性(根据比较规则排序)
  3. 使用成本较低(成本计算)

2.1 索引列在表达式或函数中【必】

这个很好理解,因为函数会改变索引本身的值,不再具有有序性

2.2 联合索引中,非最左前缀【必】

联合索引中,非最左前缀是无序的

2.3 联合索引中,最左前缀,但是中间有范围查询,那么范围查询后面的列都用不到索引【必】

a, b, c 三列索引,先按照 a 排序,后按照 b 排序,再按照 c 排序

语句 a=1 and b > 1 and c=2 只能使用 a, b 索引进行筛选,c=1 条件需要将前面筛选之后的索引结果逐一比较之后返回结果。

a 索引过滤之后是有序的,所以可以使用 b 索引进行过滤,b 过滤之后是无序的(也有可能是有序的,但是 innodb 不会再去判断是否有序)

2.4 join... on...,主键和外键的索引数据类型不一致【必】

强类型下,数据类型不一致,需要特殊处理才能比较

2.5 在无索引的列上使用了 or 那么有索引的列也用不上了【可】

这个只是有可能,因为 innodb 底层是基于成本选择使用索引的。

因为在无索引的列上使用 or 会使成本变大,所以很容易无法使用索引。

2.6 in 查询语句中多个值的数据类型不一致的情况,如:in (1, 2, 3, 4, "5")【必】

强类型下,数据类型不一致,需要特殊处理才能比较

但是如果 in 里面都是字符串或者都是数字,innodb优化器会将其统一转成索引所需类型。

2.7 in 语句中超过 200 个值【可】

in 语句中 5.7 版本上 超过 200 个值,就会放弃使用 index_dive 方式计算cost,从而导致估算不准确,很容易用不上索引

5.6 以下版本 req_index_dive_limit10,可以酌情修改成 200

Mysql (InnoDB)在什么情况下无法使用索引

原文:https://www.cnblogs.com/wudanyang/p/12923149.html

您可能感兴趣的文档:

--结束END--

本文标题: MySQL (InnoDB)在什么情况下无法使用索引

本文链接: https://www.lsjlt.com/news/6199.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • mysql索引什么情况下会失效
    mysql索引在不使用索引列进行查询、数据类型不匹配、前缀索引的使用不当、使用函数或表达式进行查询、索引列的顺序不正确、数据更新频繁和索引过多或过少情况下会失效。1、不使用索引列进行查询,为了避免这种情况,应该在查询中使用适当的索引列;2、...
    99+
    2023-08-09
  • MySQL数据库中什么情况下需要使用索引
    这篇文章主要介绍MySQL数据库中什么情况下需要使用索引,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!什么情况下需要使用索引(1)列经常被用于where条件中(2)列中有大...
    99+
    2024-04-02
  • MySQL调优之索引在什么情况下会失效详解
    目录前言【1】全值匹配我最爱【2】最佳左前缀法则【3】主键插入顺序【4】计算、函数、类型转换(自动或手动)导致索引失效【5】范围条件右边的列索引失效【6】不等于(!=或者 <>) 索引失效【7】is null...
    99+
    2024-04-02
  • 在什么情况下会使用mysql临时表
    这篇文章主要介绍在什么情况下会使用mysql临时表,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!MySQL在很多情况下都会用到临时表,总结一下什么时候会用到临时表:什么是临时表:My...
    99+
    2024-04-02
  • 在什么情况下使用Builder模式
    今天小编给大家分享一下在什么情况下使用Builder模式的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。适用性在以下情况使用B...
    99+
    2023-06-19
  • java闭包在什么情况下使用
    闭包在以下情况下使用: 当一个方法需要访问外部作用域的变量时,可以使用闭包。闭包可以将变量保存在函数内部,并且可以在函数外部访问...
    99+
    2023-10-27
    java
  • mysql中什么情况会导致索引失效
    这篇文章主要为大家展示了“mysql中什么情况会导致索引失效”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“mysql中什么情况会导致索引失效”这篇文章吧。为了讲解以下索引内容,我们先建立一个临时...
    99+
    2023-06-25
  • MongoDB中什么情况下索引会选择策略
    这篇“MongoDB中什么情况下索引会选择策略”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“MongoDB中什么情况下索引会...
    99+
    2023-06-29
  • 在什么情况下可以使用web工厂方法
    这篇文章主要介绍了在什么情况下可以使用web工厂方法的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇在什么情况下可以使用web工厂方法文章都会有所收获,下面我们一起来看看吧。适用性在下列情况下可以使用Factor...
    99+
    2023-06-19
  • 什么情况下需要使用SPFA 算法
    什么情况下需要使用SPFA 算法?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。适用范围:给定的图存在负权边,这时类似Dijkstra等算法便没有了用武之地,而Bellman-F...
    99+
    2023-05-31
    spfa算法 情况下
  • 在什么情况下可以使用Singleton模式
    这篇文章主要介绍“在什么情况下可以使用Singleton模式”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“在什么情况下可以使用Singleton模式”文章能帮助大家解决问题。适用性在下面的情况下可以...
    99+
    2023-06-19
  • 网站在什么情况下使用VPS主机
    本篇文章给大家分享的是有关网站在什么情况下使用VPS主机,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。主机行业很花俏,他们提供了大量的选择,以适应用户千奇百怪的需求。但和其他事...
    99+
    2023-06-12
  • JavaScript无法检索大写字母是什么情况
    JavaScript一般会检索字符串中的所有字符,包括大写字母和小写字母。但是,如果有情况出现无法检索大写字母,那么我们需要考虑以下几种情况:首先,我们需要确认字符串中是否真的包含大写字母。如果字符串中只包含小写字母,那么当我们使用大小写不...
    99+
    2023-05-14
  • Mysql无法启动情况下怎么恢复数据
    如果MySQL无法启动,但数据文件仍然存在,您可以尝试以下方法来恢复数据: 检查错误日志:首先查看MySQL的错误日志文件,通常...
    99+
    2024-04-09
    Mysql
  • 浅谈Mysql在什么情况下会使用内部临时表
    union执行 为了便于分析,使用一下sql来进行举例 CREATE TABLE t1 ( id INT PRIMARY KEY, a INT, b INT, IN...
    99+
    2024-04-02
  • 什么情况下使用Adapter模式
    本篇内容主要讲解“什么情况下使用Adapter模式”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“什么情况下使用Adapter模式”吧!适用性以下情况使用Adapter模式• 你想使用一个已经存在...
    99+
    2023-06-19
  • 什么情况下停止使用golang
    在现代编程领域中,Golang (又称 Go) 已经成为一个热门的编程语言。Golang 的设计目标是为了创建高效、可读性强、易于维护和编写的编程语言。它让编程变得更加简单,且在大规模高并发的应用程序开发上表现良好。然而,我们也需要看到问题...
    99+
    2023-05-14
  • 什么情况下需要使用redis
    这篇文章给大家分享的是有关什么情况下需要使用redis的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。redis是一个key-value存储系统。和Memcached类似,它支持存...
    99+
    2024-04-02
  • VB.NET共享成员需要在什么情况下使用
    本篇内容介绍了“VB.NET共享成员需要在什么情况下使用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!VB.NET作为一款优秀的面向对象语言...
    99+
    2023-06-17
  • 什么情况下不能使用Java泛型
    这篇文章主要讲解了“什么情况下不能使用Java泛型”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“什么情况下不能使用Java泛型”吧!1. 前言Java 1.5 引入了泛型来保证类型...
    99+
    2023-06-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作