MySQL索引失效的七大场景

这篇具有很好参考价值的文章主要介绍了MySQL索引失效的七大场景。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

口诀

模型数或运算快

初始化数据库

这里我们以MySQL自带的world数据库中的country表为例。

索引失效七大场景

模(模糊查询)

向name列添加索引

create index index_name on country(name);

查看country表索引

show index from country;

MySQL索引失效的七大场景

  • 测试like完全匹配
explain select count(1) from country  where name like '%Aruba%'

MySQL索引失效的七大场景
可以看到type级别是index。索引失效。

在 MySQL 中,使用 EXPLAIN 语句可以查看查询语句的执行计划,了解 MySQL 如何执行查询。其中,EXPLAIN
语句的结果集中的 type 字段用于表示 MySQL 在执行查询时所使用的访问类型。
type 字段可能的取值包括:
system:表示只有一行数据的表,通常是一些系统表; const:表示只有一行数据的表,通常是通过在查询中指定主键或唯一索引来检索数据;
eq_ref:表示使用了连接索引,且索引的所有部分都被使用,一般出现在连接查询中;
ref:表示使用了非唯一性索引,返回匹配某个单独值的所有行;
fulltext:表示使用全文索引进行搜索;
ref_or_null:表示使用非唯一性索引,但可能存在一个或多个 NULL 值;
index_merge:表示使用了多个索引进行查询,并将结果进行合并;
unique_subquery:表示使用了子查询,并且该子查询使用了唯一性索引;
index_subquery:表示使用了子查询,并且该子查询使用了非唯一性索引;
range:表示使用了索引进行范围查询;
index:表示全表扫描,并且按索引顺序扫描;
all:表示全表扫描。
需要注意的是,type字段的取值顺序是从最好到最差的查询类型顺序。当 type 字段的取值是 system、const、eq_ref 时,性能最好;当 type字段的取值是 all 时,性能最差。
通过查看 type字段的取值,可以评估查询的性能并优化查询。通常来说,使用索引查询会比全表扫描查询更快速、更高效。因此,尽可能地使用索引来优化查询是一个很好的选择。

  • 测试like左匹配
explain select count(1) from country where Name like '%Aruba'

MySQL索引失效的七大场景
type级别为index,索引失效。

  • 测试like右匹配
explain select count(1) from country where Name like 'Aruba%';

MySQL索引失效的七大场景
type级别为range,索引命中!
所以注意模糊查询右匹配可以命中!!!

型(数据类型)

如果数据类型不匹配那么索引就会失效。
如下面的sql

explain select count(1) from country where name=1

MySQL索引失效的七大场景

数(函数)

对索引的字段使用内部函数,索引也会失效。
对population字段创建索引

create index index_population on country(population);

MySQL索引失效的七大场景
这里对population字段使用POW函数

explain select pow(Population,2) from country;

MySQL索引失效的七大场景
索引失效。

或(OR)

where语句中使用or来连接的字段,如果一个有索引一个没索引,那么存储引擎将放弃索引而全表扫描

explain select count(1) from country where name like 'Aruba%' or SurfaceArea=193;

MySQL索引失效的七大场景
级别为ALL,全表扫描,索引失效。

运(运算)

对索引的列进行算术运算将使索引失效。

explain select count(1) from country where Population+1>100000;

MySQL索引失效的七大场景

最(最左原则)

嘴和索引,查询的条件列不是联合索引的第一个列,索引失效。
给Continent,Region,IndepYear字段创建联合索引

create index index_union on country(Continent,Region,IndepYear);

MySQL索引失效的七大场景

  • where条件中包含联合索引最左字段
explain select count(1) from country where Region='Caribbean' and Continent='North America';

MySQL索引失效的七大场景
级别为ref,索引有效。

  • where条件中不包含联合索引最左字段
explain select count(1) from country where IndepYear IS NULL and Continent='North America';

MySQL索引失效的七大场景
索引失效。

快(查询数据量大)

当查询数量超过表的一部分,索引就会失效。

explain select count(1) from country where Population>=0;

MySQL索引失效的七大场景
Population>=0全部数据都会查出,type是index,索引失效。文章来源地址https://www.toymoban.com/news/detail-421163.html

到了这里,关于MySQL索引失效的七大场景的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • MySQL会导致索引失效的情况与解决索引失效的方法

    什么情况会导致索引失效 索引失效也是慢查询的主要原因之一,常见的导致索引失效的情况有下面这些: 1.使用 SELECT * 进行查询; 2.创建了组合索引,但查询条件未准守最左匹配原则; 3.在索引列上进行计算、函数、类型转换等操作; 4.以 % 开头的 LIKE 查询比如 like \\\'%abc\\\'; ; 5.查

    2023年04月08日
    浏览(61)
  • MySQL 索引失效详解

    一、MySQL索引失效原因汇总 隐式的类型转换,索引失效 查询条件包含or,可能导致索引失效 like通配符可能导致索引失效 查询条件不满足联合索引的最左匹配原则 在索引列上使用mysql的内置函数 对索引进行列运算(如,+、-、*、/) 索引字段上使用 (! = 或者 ),索引可能失效 索

    2024年02月02日
    浏览(44)
  • mysql 查询优化 、索引失效

    查询优化 物理查询优化 通过索引和表连接方式等技术来进行优化,这里重点需要掌握索引的使用 逻辑查询优化 通过SQL 等价变换 提升查询效率,直白一点就是说,换一种查询写法执行效率可能更高 索引失效 计算、函数、类型转换(自动或手动)导致索引失效 select sql_no_c

    2024年02月10日
    浏览(46)
  • Mysql中索引优化和失效

    要了解索引优化和索引失效的场景就要先了解什么是索引 索引是一种有序的存储结构,按照单个或者多个列的值进行排序,以提升搜索效率。 索引的类型 UNIQUE唯一索引 不可以出现相同的值,可以有NULL值。 INDEX普通索引 允许出现相同的索引内容。 PRIMARY KEY主键索引 不允许出

    2024年02月20日
    浏览(44)
  • 第20章:MySQL索引失效案例

    1. 全值匹配我最爱 当SQL查询 创建3个索引 当前优化器会选择跟where条件匹配最高的idx_age_classid_name索引,直接查询出对应的主键值然后回表查询,此时的效率最高。所以部分索引失效,因为使用的部分索引,会查询多个主键值还需要回表继续判断,效率低。 2. 最佳左前缀规则

    2024年02月11日
    浏览(38)
  • 详解MySQL索引失效的几种情况

    MySQL索引是提高查询效率的重要手段。索引失效会导致查询效率下降,甚至全表扫描,影响数据库性能。以下是可能导致MySQL索引失效的情况: 当where语句中使用 or 操作符并且 or 两边的条件涉及到至少两个字段时,MySQL无法使用索引,会转向全表扫描。因此,应尽量避免使用

    2024年02月01日
    浏览(44)
  • MySQL索引3——Explain关键字和索引优化(SQL提示、索引失效、索引使用规则)

    目录 Explain 索引性能分析 Id ——select的查询序列号 Select_type——select查询的类型 Table——表名称 Type——select的连接类型 Possible_key ——显示可能应用在这张表的索引 Key——实际用到的索引 Key_len——实际索引使用到的字节数 Ref    ——索引命中的列或常量 Rows——预

    2024年02月14日
    浏览(56)
  • mysql : name like “%name“; 索引一定失效吗?

    场景如下: MySQL版本如下: 表结构如下: 索引结构如下: 查询语句以及执行计划如下: 第一条查询语句: select name from em where name like ‘%b’; 可以发现使用了name 字段创建的索引 第二条查询语句: select id from em where name like ‘%b’; 第三条查询语句: select * from em where name l

    2024年02月03日
    浏览(38)
  • 面试官:讲讲MySql索引失效的几种情况

    拓展:Alibaba《Java开发手册》 【强制】页面搜索严禁左模糊或者全模糊,如果需要请走搜索引擎来解决。 注意: 当数据库中的数据的索引列的 NULL值达到比较高的比例的时候 ,即使在IS NOT NULL 的情况下 MySQL的查询优化器会选择使用索引, 此时type的值是range(范围查询) 测试

    2024年02月11日
    浏览(36)
  • MySQL索引3——Explain关键字和索引使用规则(SQL提示、索引失效、最左前缀法则)

    目录 Explain 索引性能分析 Id ——select的查询序列号 Select_type——select查询的类型 Table——表名称 Type——select的连接类型 Possible_key ——显示可能应用在这张表的索引 Key——实际用到的索引 Key_len——实际索引使用到的字节数 Ref    ——索引命中的列或常量 Rows——预

    2024年02月14日
    浏览(44)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包