Mysql索引失效的场景分析

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

前言:

日常使用Mysql做一些业务时,发现很慢,跟踪日志返现是有慢查询语句,于是使用explain查看执行计划发现是没有使用到索引,一般这些情况都不是java框架导致的,一般框架里都会根据主键或者指定的条件去做简单的查询,复杂的查询都是通过sql原生写法来实现的,这种原生写法最容易产生类似这样的问题。

产生索引失效的场景

1、在sql中使用了函数,比如sum,count等内置函数,这种情况下即使where条件中使用到了索引也会索引失效。
2、在where语句中使用到了联合索引,但是使用的时候违反了最左原则。比如联合索引创建的时候为name,age 但是使用的时候确实where age = 1 and name = ‘cz’,这样会导致age的索引失效仅剩name索引。
3、在查询语句中一些字段的属性错误,比如name的字段定义为varchar,但是使用的时候条件写成了where name=cz,这样会导致mysql在真实查询的时候查找索引失败。
4、在sql中,如果使用模糊查询,但是字段为全模糊的比如:where name like ‘%cz%’,这种场景下索引是失效的,如果使用的语句为where name like ‘cz%’,那么这种索引反而是生效的。
5、在查询语句中出现了or,那么这个语句是不会使用到索引的

以上这些就是在写sql时经常遇到的一些索引失效的场景。

如果在java中,如果使用mybatis则需要手写sql,所以上面的场景需要格外注意。

其他慢sql调优手段

1、避免使用select * 多余的字段会消耗IO

2、使用索引

3、使用join替换in(看具体数据库来决定)

原因:分布式数据库exists效率低

4、join优化,如果执行计划中有使用Block-Nasted-Loop,需要根据实际情况增加缓存区的内存空间

5、大结果集的排序,如果结果集很大会涉及到文件排序(File-sort),需要根据业务拆分为小结果集再排序
6、在使用inner join时,如果优化器判断有误,这个时候要使用straght join来指定驱动表 hint方式

7、在查询语句中如果优化器使用索引不合理,需要使用FORCE INDEX指定索引。hint方式

8、delete/update关联操作,DML直接JOIN关联两张实体表,改成关联1张实体表和1个Join结果集

9、大事务拆分提交,如果一次事务太大可能会堵塞小事务的提交

10、使用group by进行分组查询时,默认会按照分组字段进行排序,也就是默认会在语句后面添加order by文章来源地址https://www.toymoban.com/news/detail-418954.html

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

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

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

相关文章

  • 索引什么场景下会失效?

    我觉得索引失效只有两种情况 ● 一种是, 无法使用索引,用不上索引 ● 还有一种是, 没必要走索引 ,直接全表扫描(Type = All),把主键索引的叶子节点全部走一遍的效率(全表扫描),比走二级索引,然后再回表的效率高。 ● 比如说, 范围查询占比太大 ,超过了全表的30

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

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

    2024年02月14日
    浏览(44)
  • 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)
  • 慢SQL原因分析之索引失效

    最近收到一个慢sql工单,慢sql大概是这样:“select xxx from tabel where type = 1”。 咦,type字段明明有索引啊,为啥是慢sql呢? 通过执行explain,发现实际上数据库执行了全表扫描,从而被系统判定为慢sql。这时有一定开发经验的同事会说:“字段区分度不够,这种字段作单独索引

    2024年02月08日
    浏览(63)
  • 第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 : 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)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包