iis服务器助手广告广告
返回顶部
首页 > 资讯 > 数据库 >5.索引失效的原因(11种情况,详讲)
  • 664
分享到

5.索引失效的原因(11种情况,详讲)

数据库sqlmysql 2023-09-11 11:09:08 664人浏览 薄情痞子
摘要

1)没有查询条件,或者查询条件的列没有索引,则不走索引 EXPLaiN SELECT sql_NO_CACHE * FROM student WHERE age=30;EXPLAIN SELECT SQL_NO_CA

1)没有查询条件,或者查询条件的列没有索引,则不走索引

EXPLaiN SELECT sql_NO_CACHE * FROM student WHERE age=30;EXPLAIN SELECT SQL_NO_CACHE * FROM student WHERE age=30 AND classId=4;EXPLAIN SELECT SQL_NO_CACHE * FROM student WHERE age=30 AND classId=4 AND NAME = 'abcd';

2)最佳左前缀法则

索引文件具有 B-Tree 的最左前缀匹配特性,如果左边的值未确定,那么无法使用此索引

3)主键插入顺序

对于一个使用InnoDB存储引擎的表来说,在我们没有显式的创建索引时,表中的数据实际上都是存储在聚簇索引的叶子节点的。而记录又是存储在数据页中的,数据页和记录又是按照记录主键值从小到大的顺序进行排序,所以如果我们插入的记录的主键值是依次增大的话,那我们每插满一个数据页就换到下一个数据页继续插,而如果我们插入的主键值忽大忽小的话,就比较麻烦了,假设某个数据页存储的记录经满了,它存储的主键值在1~100之间:

773117b56e2d4f14a60dced40593b3b0.png

如果此时再插入一条主键值为 9 的记录,那它插入的位置就如下图:

de1193a3f23f45a4a1d43c1392ef1e87.png

可这个数据页已经满了,再插进来咋办呢?

  • 我们需要把当前 页面分裂 成两个页面,把本页中的一些记录移动到新创建的这个页中。
  • 页面分裂和记录移位意味着什么?意味着: 性能损耗 !
  • 所以如果我们想尽量避免这样无谓的性能损耗,最好让插入的记录的 主键值依次递增 ,这样就不会发生这样的性能损耗了。
  • 建议:让主键具有 AUTO_INCREMENT ,让存储引擎自己为表生成主键,而不是我们手动插入

#4)计算、函数、类型转换(自动或手动)导致索引失效

能够使用上索引EXPLAIN SELECT SQL_NO_CACHE * FROM student WHERE student.name LIKE 'abc%';#函数运算,索引失效EXPLAIN SELECT SQL_NO_CACHE * FROM student WHERE LEFT(student.name,3) = 'abc';

5)类型转换导致索引失效

如果不带引号,就是数字,字符类型不匹配,不走索引。

#索引失效EXPLAIN SELECT SQL_NO_CACHE * FROM student WHERE NAME = 123;#走索引EXPLAIN SELECT SQL_NO_CACHE * FROM student WHERE NAME = '123';

6)范围条件右边的列索引失效

student.classId>20; 范围索引失效

#走了age索引,范围后面的索引失效EXPLAIN SELECT SQL_NO_CACHE * FROM studentWHERE student.age = 30 AND student.classId>20 AND student.name = 'abc' ;EXPLAIN SELECT SQL_NO_CACHE * FROM studentWHERE student.age=30 AND student.name = 'abc' AND student.classId>20;

7)不等于(!= 或者<>)索引失效

#走索引EXPLAIN SELECT SQL_NO_CACHE * FROM student WHERE student.name = 'abc' ;#索引失效EXPLAIN SELECT SQL_NO_CACHE * FROM student WHERE student.name <> 'abc' ;EXPLAIN SELECT SQL_NO_CACHE * FROM student WHERE student.name != 'abc' ;

8)is null可以使用索引,is not null无法使用索引

#使用索引EXPLAIN SELECT SQL_NO_CACHE * FROM student WHERE age IS NULL;#无法使用索引EXPLAIN SELECT SQL_NO_CACHE * FROM student WHERE age IS NOT NULL;

9)like以通配符%开头索引失效

#走索引EXPLAIN SELECT SQL_NO_CACHE * FROM student WHERE NAME LIKE 'ab%';#索引失效EXPLAIN SELECT SQL_NO_CACHE * FROM student WHERE NAME LIKE '%ab%';

10)查询条件包含or且字段列不含索引

EXPLAIN SELECT SQL_NO_CACHE * FROM student WHERE age = 10 OR classid = 100;

辅助索引+or+无索引的列:会先走索引列,但无索引的列会进行全表扫描,所以还不如不走索引,直接都全表扫描完事。

如果or前后都有索引,那么可能走索引,也可能不走索引。

11)数据库和表的字符集统一使用utf8mb4

统一使用utf8mb4( 5.5.3版本以上支持)兼容性更好,统一字符集可以避免由于字符集转换产生的乱码。不同的 字符集 进行比较前需要进行 转换 会造成索引失效。

一般性建议:

●对于单列索引,尽量选择针对当前query过滤性更好的索引

●在选择组合索引的时候,当前query中过滤性最好的字段在索引字段顺序中,位置越靠前越好。

●在选择组合索引的时候,尽量选择能够包含当前query中的where子句中更多字段的索引。

●在选择组合索引的时候,如果某个字段可能出现范围查询时,尽量把这个字段放在索引次序的最后面。

总之,书写SQL语句时,尽量避免造成索引失效的情况。

 

来源地址:https://blog.csdn.net/weixin_45783741/article/details/127034372

您可能感兴趣的文档:

--结束END--

本文标题: 5.索引失效的原因(11种情况,详讲)

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

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

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

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

下载Word文档
猜你喜欢
  • 5.索引失效的原因(11种情况,详讲)
    1)没有查询条件,或者查询条件的列没有索引,则不走索引 EXPLAIN SELECT SQL_NO_CACHE * FROM student WHERE age=30;EXPLAIN SELECT SQL_NO_CA...
    99+
    2023-09-11
    数据库 sql mysql
  • SQL索引失效的11种情况详析
    目录索引失效案例【1】. 全值匹配【2】. 最佳左前缀法则【3】. 主键插入顺序【4】. 计算、函数、类型转换(自动或手动)导致索引失效【5】. 类型转换导致索引失效【6】. 范围条件右边的列索引失效【7】. 不等于(!...
    99+
    2023-03-09
    sql索引失效 sql如何加索引 怎么判断sql是否走索引
  • 详解MySQL索引失效的几种情况
    MySQL索引是提高查询效率的重要手段。索引失效会导致查询效率下降,甚至全表扫描,影响数据库性能。以下是可能导致MySQL索引失效的情况: 1. 使用or操作符 当where语句中使用or操作符并且or两边的条件涉及到至少两个字段...
    99+
    2023-09-03
    数据库 mysql java
  • mysql索引失效的几种情况
    常见情况:1、使用函数或运算;2、隐式类型转换;3、使用不等于(!=或);4、使用like操作符,并以通配符开头;5、or条件;6、null值;7、索引选择性低;8、复合索引的最左前缀原...
    99+
    2024-02-22
    mysql 索引失效 mysql索引 隐式类型转换
  • oracle索引失效的情况有哪几种
    有以下几种情况可能导致Oracle索引失效:1. 索引列上的数据分布不均匀:如果索引列上的数据分布不均匀,即某些值出现的频率非常高,...
    99+
    2023-10-08
    oracle
  • MySQL索引失效的几种情况小结
    目录1.最左前缀原则2. 计算、函数使索引失效3. 类型转换导致索引失效4. 不等于(<>或!=)导致索引失效5. is not null /is null可能不走索引,也可以走索引6. 模糊匹配Like以%...
    99+
    2023-03-20
    MySQL索引失效 数据库索引失效
  • mysql索引失效的几种情况分析
    1、最佳左前缀原则——如果索引了多列,要遵守最左前缀原则。指的是查询要从索引的最左前列开始并且不跳过索引中的列。 前提条件:表中已添加复合索引(username,password,a...
    99+
    2024-04-02
  • SqlServer索引失效的情况有哪些
    表数据量过小或者分布不均匀,导致SQL Server查询优化器认为使用索引扫描的代价大于全表扫描,从而选择全表扫描而不是使用索引...
    99+
    2024-04-16
    SqlServer
  • innodb索引失效的情况有哪些
    数据量过大:当数据表中的数据量非常大时,索引可能会失效,因为MySQL可能会选择不使用索引而进行全表扫描,这样会导致查询性能下降...
    99+
    2024-03-14
    innodb
  • MySQL索引失效的情况有哪些
    这篇文章主要讲解了“MySQL索引失效的情况有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“MySQL索引失效的情况有哪些”吧!1.最左前缀原则在MySQL数据库中,联合索引遵守最左前缀...
    99+
    2023-07-05
  • Mysql进阶优化篇02——索引失效的10种情况及原理
    前 言 🍉 作者简介:半旧518,长跑型选手,立志坚持写10年博客,专注于java后端 🍌 专栏简介:mysql基础、进阶,主要讲解mysql数据库sql刷题、进...
    99+
    2023-08-31
    mysql 大数据 索引 数据库 sql调优
  • SQL索引失效的情况有哪些
    这篇文章主要介绍了SQL索引失效的情况有哪些的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇SQL索引失效的情况有哪些文章都会有所收获,下面我们一起来看看吧。数据库调优的大致方向:索引失效,没有充分利用到索引&a...
    99+
    2023-07-05
  • mysql索引失效的原因
    小编给大家分享一下mysql索引失效的原因,希望大家阅读完这篇文章后大所收获,下面让我们一起去探讨吧!索引对于MySQL而言,是非常重要的篇章。索引知识点也巨多,要想掌握透彻,需要逐个知识点一一击破,今天来...
    99+
    2024-04-02
  • mysql引发索引失效的情况有哪些
    这篇文章主要讲解了“mysql引发索引失效的情况有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“mysql引发索引失效的情况有哪些”吧!1、在查询条件中计算索引列的使用函数或操作。若已建...
    99+
    2023-06-20
  • mysql索引失效的常见九种原因图文详解
    目录前言:1.最佳左前缀法则3.计算、函数、类型转换(自动或手动)导致索引失效4.范围条件右边的列索引失效5.不等于(!= 或者<>)导致索引失效6.is null可以使...
    99+
    2024-04-02
  • 索引失效的情况和解决方法
    1. 尽量避免在字段开头模糊查询,会导致数据库引擎放弃索引进行全表扫描 SELECT * FROM user WHERE name LIKE '%用%'​-- 优化方式:尽量在字段后面使用模糊查询SELECT * F...
    99+
    2023-09-16
    数据库 mysql java
  • 索引失效的7个原因
    索引失效的7个原因 概述1. 最左匹配原则2. 使用函数3. 计算操作4. Like %5. 使用Or导致索引失效6. in使用不当7. order By8. 总结9. 补充 SELECT *...
    99+
    2023-09-23
    mysql java 数据库
  • MySQL导致索引失效的情况有哪些
    本篇内容主要讲解“MySQL导致索引失效的情况有哪些”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“MySQL导致索引失效的情况有哪些”吧!一、准备工作首先准备两张表用于演示:CREATE&nbs...
    99+
    2023-07-02
  • oracle联合索引失效的情况有哪些
    以下是一些导致Oracle联合索引失效的情况: 数据分布不均匀:如果联合索引的列中的值分布不均匀,查询可能会导致索引失效。例如,...
    99+
    2023-10-25
    oracle
  • mysql组合索引失效的情况有哪些
    MySQL组合索引失效的情况有以下几种:1. 索引列的顺序不符合查询条件:组合索引的顺序非常重要,如果查询条件中的列不按照组合索引的顺序进行查询,那么组合索引将失效。2. 索引列被使用了函数或表达式:如果查询条件中的索引列被使用了函数或...
    99+
    2023-08-09
    mysql
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作