索引失效问题整理_hive索引失效_luffy5459的博客-程序员秘密

技术标签: explain  database  联合索引  index  左列前缀  mysql  索引失效  

    在面试的时候,数据库方面的问题对于开发人员来说,是绕不过的一个点,而数据库方面,很少直接面试SQL怎么写,而是问效率相关的问题,索引是提高查询效率的一种手段,但是往往,我们容易忽略的一个问题就是索引失效。

    我以前面试,人家问我索引失效,我没反应过来,心想我创建了索引,查询就完事了,怎么会失效呢?后来才知道,索引创建成功,如果查询的时候,选择的字段或者查询的条件设置不合理,虽然能够出结果,但是索引是失效的,这就是索引失效的情形。

    下面来总结一下,索引失效的情况,有点小复杂。

  1. 对于联合索引,违背索引最左前缀原则。
  2. 对索引列使用函数。
  3. 对索引列作运算操作(条件右边使用运算符,索引会生效)。
  4. 使用like关键字,并以'%'开始(使用'%'结尾索引是生效的)。
  5. 使用不等于操作符<>。
  6. 使用not null。
  7. 使用or,or两边的列索引名称不一样,而且一个有索引,另一个没有索引。(or两边的列相同或者都有索引会生效)。
  8. 索引列存在类型转换。

    从运行sql角度来验证这些失效的情况。首先,我们要准备表,其次,建立对应的索引,最后查询的时候,使用explain执行计划,查看运行结果。   

     联合索引,左列前缀 

    从截图可以看出,对emp表创建联合索引(name,age,salary)

    1)、当使用全部索引时,用到了索引;

    2)、当不使用最左列name时,索引失效。

    3)、当使用了最左列name,中间列age缺失,索引还是生效的。

    索引列使用函数

    索引使用数据库自带的函数,当函数在左边,索引失效,当函数在右边,索引生效。    

    索引列计算 

    如果对索引列进行计算,索引会失效。  

    like关键字

    使用like关键字,如果'%'在左边,比如'%a',那么索引会失效。如果'%'在右边,比如'a%',那么索引会生效。    

    不等于<>    

      对于普通的索引,<>,!=都不会生效。

     有生效的情况。

    使用not null

    使用null生效,使用not null不生效

    or关键字

    使用or关键字,不是说一定会失效,就是说or两边的列要么一样,要么两个都建立了索引。    

    类型转换

    如果列是字符串类型,这个时候,直接传入数字,虽然不会报错,而且也能查询出结果,但是通过类型转换的,索引会失效。

     索引失效,大致分为两类,违背最佳左前缀法则,联合索引和like关键字,使用左列和'a%'匹配其实索引都是可以生效的。另一类是进行字段计算类,这一类改变了列的值,再通过改变的值去索引,当然不可能与原始值的索引匹配,所以失效。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/feinifi/article/details/119761531

智能推荐

SLAM学习——建图(二)_orb-slam3建八叉树图_Hansry的博客-程序员秘密

1.对单目构建稠密地图的讨论像素梯度的问题在前面中,通过块匹配来获得匹配结果。块匹配的正确与否,依赖于图像块是否具有区分度,有明显梯度的小块将具有良好的区分度。对于梯度不明显的像素,将比较难估计其有效深度。立体视觉一个常见问题:对物体纹理的依赖性。像素梯度与极线的关系:像素梯度平行于极线方向以及垂直于极线方向。 像素梯度垂直于极线:当沿极线寻找的时候,发现匹配程度是一样的,得到不到有效匹配。

BRVAH的BaseRecyclerViewAdapterHelper与MVVM模式优雅结合,Recyclerview如何在Databinding中快捷、方便地使用(三)_古诚欺的博客-程序员秘密

BRVAH的BaseRecyclerViewAdapterHelper与MVVM模式优雅结合(其一) BRVAH的BaseRecyclerViewAdapterHelper与MVVM模式优雅结合(其二)好,在看本篇之前,请先看我写的上面2个篇章。上一章讲了加载更多。这时,就会有同学问:哎呀,古诚欺啊,那像聊天界面这种应该怎么实现呢?这你问对人了,我们接着往下说。...

【VueJS】windows环境安装vue-cli及webpack并创建VueJS项目_dengzhuang8619的博客-程序员秘密

1. 安装node.js, Node.js安装包及源码下载地址为:https://nodejs.org/en/download/。这次node.js不是主角,默认已安装好了,通过npm –v查看node.js是否安装好以及安装的node.js版本如果你安装的是旧版本的 npm,可以通过 npm 命令“npm install npm -g”来进行版本升级。...

盘点多款国产 Linux 桌面操作系统_weixin_38754349的博客-程序员秘密

code小生一个专注大前端领域的技术平台公众号回复Android加入安卓技术群来自公众号:strongerHuang素材来源:百度百科、网络国产操作系统多为以Linux 为基础二次开发...

CORS 跨域-程序员秘密

CORSCORS 是一个 W3C 标准,全称是“跨域资源共享”(Cross-origin resource sharing)。它允许浏览器向跨域的服务器,发出XMLHttpRequest请求,从而克服了 AJAX 只能同源使用的限制。简介CORS 需要浏览器和服务器同时支持。目前,所有浏览器都支持该功能。整个 CORS 通信过程,都是浏览器自动完成,不需要用户参与。对于开发者来说,CORS 通信与普通的 AJAX 通信没有差别,代码完全一样。浏览器一旦发现 AJAX 请求跨域,就会自动添加一些附加的

随便推点

boost::asio::io_service(之一)_yanziguilai的博客-程序员秘密

boost::asio::io_service/// Provides core I/O functionality./** * The io_service class provides the core I/O functionality for users of the * asynchronous I/O objects, including: * io_service

repeater和radiobutton 不能单选 的问题_sjj2011的博客-程序员秘密

由于radiaobutton是服务控件(即使你用htmlinputradio 控件 也不行,只要加了runat='server' 都不行),所以它生成的html的name属性都是不一样,即使你加了groupname 也不行。 因此 不能达到一次只选一个的目标。 解决这个问题有3个方法;1.使用 不要加runat='server'2.通过js控制一次只能选一个i:function s

面试---C/C++基础_xxwqlee的博客-程序员秘密

这里写自定义目录标题欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入欢迎使用Ma...

01黑马QT笔记之应用程序框架说明_qt6 qt+=core gui_Mango酱的博客-程序员秘密

01黑马QT笔记之应用程序框架说明1 首先,点击文件新建项目,依次选择红色圈圈,然后choose。2 进入以下画面,第一行为项目名字(我记得好像中文名字会编译出错),然后选择自己放项目的位置,勾选默认,下一步。3 点击下一步。4 类名表示我们要创建的类的名字,基类是我们创建的类继承的基类,我选择了QWidget,这个是所有窗口的基类,第一个是带菜单栏的基类;第三个是对话框的基类。这里...

NLP-文本向量化:Word Embedding 一般步骤【字符串->分词->词汇序列化->词汇向量化】_embedding 字符串_u013250861的博客-程序员秘密

自然语言处理-文本处理-文本向量化:Word Embedding【字符串->分词->词汇序列化->词汇向量化】

推荐文章

热门文章

相关标签