返回顶部
首页 > 资讯 > 数据库 >MySQL 使用 OR 条件导致索引失效
  • 531
分享到

MySQL 使用 OR 条件导致索引失效

mysql性能优化 2023-09-05 11:09:31 531人浏览 安东尼
摘要

背景:需要根据工号或英文名带出中文名,但数据量过大,导致响应时间过长 查询工号为 x20230506 或者英文名是 codeporter 的用户信息 select * from user_test where login

背景:需要根据工号或英文名带出中文名,但数据量过大,导致响应时间过长

查询工号为 x20230506 或者英文名是 codeporter 的用户信息

select * from user_test where login="x20230506" or login_id="codeporter"

查看Mysql版本:

select version();
version()
8.0.18

创建普通索引

alter table  user_test add index user_idx_login(login)alter table  user_test add index user_idx_login_id(login_id)

使用EXPLaiN分析后面SELECT语句的执行情况,并且能够分析出所查询表的一些特征。 

explain select * from user_test where login="x20230506" or login_id="codeporter"  

查询条件中有or,即使两个条件都带索引也会失效  

idselect_typetablepartitionstypepossible_keyskeykey_lenrefrowsfilteredExtra
1SIMPLEuser_testNULLALLuser_idx_login,user_idx_login_idNULLNULLNULL1100Using where

解决办法:优化的方法是改成 UNION或者UNION ALL,分成多个 sql,走各自的索引。

UNION和UNION ALL的区别:

对重复结果的处理:UNION会去掉重复记录,UNION ALL不会

排序的处理:UNION会排序,UNION ALL只是简单地将两个结果集合

效率方面的区别:因为UNION 会做去重和排序处理,因此效率比UNION ALL慢很多

explain select * from ddc.user_test where login="x20230506" union all select * from ddc.user_test where login_id="codeporter";
idselect_typetablepartitionstypepossible_keyskeykey_lenrefrowsfilteredExtra
1PRIMARYuser_testNULLrefuser_idx_loginuser_idx_login202const1100NULL
2UNIONuser_testNULLrefuser_idx_login_iduser_idx_login_id203const1100NULL

explain关注点

重点要关注如下几列:

列名备注
type本次查询表联接类型,从这里可以看到本次查询大概的效率。
key最终选择的索引,如果没有索引的话,本次查询效率通常很差。
key_len本次查询用于结果过滤的索引实际长度。
rows预计需要扫描的记录数,预计需要扫描的记录数越小越好。
Extra额外附加信息,主要确认是否出现 Using filesort、Using temporary 这两种情况。

 其中,type包含以下几种结果,从上之下依次是最差到最好:

类型备注
ALL执行full table scan,这是最差的一种方式。
index执行full index scan,并且可以通过索引完成结果扫描并且直接从索引中取的想要的结果数据,也就是可以避免回表,比ALL略好,因为索引文件通常比全部数据要来的小。
range利用索引进行范围查询,比index略好。
index_subquery子查询中可以用到索引。
unique_subquery子查询中可以用到唯一索引,效率比 index_subquery 更高些。
index_merge可以利用index merge特性用到多个索引,提高查询效率。
ref_or_null表连接类型是ref,但进行扫描的索引列中可能包含NULL值。
fulltext全文检索。
ref基于索引的等值查询,或者表间等值连接。
eq_ref表连接时基于主键或非NULL的唯一索引完成扫描,比ref略好。
const基于主键或唯一索引唯一值查询,最多返回一条结果,比eq_ref略好。
system查询对象表只有一行数据,这是最好的情况。

MySQL中的explain解析_杨 戬的博客-CSDN博客

索引失效的情况及解决(超详细)_zyy_demon的博客-CSDN博客

来源地址:https://blog.csdn.net/yyp_abcd/article/details/130519912

您可能感兴趣的文档:

--结束END--

本文标题: MySQL 使用 OR 条件导致索引失效

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

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

猜你喜欢
  • MySQL 使用 OR 条件导致索引失效
    背景:需要根据工号或英文名带出中文名,但数据量过大,导致响应时间过长 查询工号为 x20230506 或者英文名是 codeporter 的用户信息 select * from user_test where login...
    99+
    2023-09-05
    mysql 性能优化
  • 情况导致MySQL索引失效
    MySQL索引失效的几种情况及代码示例 引言:在MySQL数据库中,索引是提高查询性能的重要因素之一。然而,有时候我们会发现索引并没有起到预期的作用,查询性能并没有得到提升,甚至还会导...
    99+
    2024-02-22
    索引选择不当 sql语句 mysql索引
  • mysql 联合索引生效的条件及索引失效的条件
    目录1.联合索引失效的条件 2.索引失效的条件 1.联合索引失效的条件 联合索引又叫复合索引。两个或更多个列上的索引被称作复合索引。 对于复合索引:Mysql从左到右的使用索引中的...
    99+
    2024-04-02
  • 会导致索引失效语句
    使用like关键字模糊查询时,% 放在前面索引不起作用,只有“%”不在第一个位置,索引才会生效(like ‘%文’–索引不起作用)2、使用联合索引时,只有查询条件中使用了这些字段中的第一个字段,索引才会生效3、使用OR关键字的查询,查询语句...
    99+
    2014-09-21
    会导致索引失效语句
  • sql会导致索引失效吗
    小编给大家分享一下sql会导致索引失效吗,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!前言网上经常能看到一些文章总结在 mysq...
    99+
    2024-04-02
  • MySQL导致索引失效的几种情况
    目录一、准备工作二、索引失效规则1.优先使用联合索引2.最左匹配原则3.范围条件右边的列索引失效4.计算、函数导致索引失效5.类型转换导致索引失效6.不等于(!= 或者<>)索引失效7.is null可以使用...
    99+
    2022-06-23
    Mysql 索引失效
  • 哪些情况会导致 MySQL 索引失效
    目录前言创建测试表和数据索引失效情况1:非最左匹配索引失效情况2:错误模糊查询索引失效情况3:列运算索引失效情况4:使用函数索引失效情况5:类型转换索引失效情况6:使用 is not...
    99+
    2024-04-02
  • MySQL避免索引列使用 OR 条件
    这个亏已经吃过很多次了,在开发以前的sql代码里面,许多以 or 作为where条件的查询,甚至更新。这里举例来说明使用 or 的弊端,以及改进办法。 select f_crm_id fro...
    99+
    2022-05-25
    mysql
  • MySQL隐式类型转换导致索引失效
    今天发现一个问题,where条件的列上明明有索引,但是执行计划还是走全表扫描mysql>  explain select task_id&n...
    99+
    2024-04-02
  • mysql中什么情况会导致索引失效
    这篇文章主要为大家展示了“mysql中什么情况会导致索引失效”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“mysql中什么情况会导致索引失效”这篇文章吧。为了讲解以下索引内容,我们先建立一个临时...
    99+
    2023-06-25
  • MySQL导致索引失效的情况有哪些
    本篇内容主要讲解“MySQL导致索引失效的情况有哪些”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“MySQL导致索引失效的情况有哪些”吧!一、准备工作首先准备两张表用于演示:CREATE&nbs...
    99+
    2023-07-02
  • 浅谈mysql哪些情况会导致索引失效
    下面有一些培训教学机构的口诀和我个人的一些总结: 为了讲解以下索引内容,我们先建立一个临时的表 test02 CREATE TABLE `sys_user` ( `id` v...
    99+
    2024-04-02
  • mysql中联合索引生效的条件及索引失效的条件是什么
    这篇文章主要介绍mysql中联合索引生效的条件及索引失效的条件是什么,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!1.联合索引失效的条件联合索引又叫复合索引。两个或更多个列上的索引被称作复合索引。对于复合索引:Mys...
    99+
    2023-06-25
  • 导致MySQL索引失效的一些常见写法总结
    前言 最近一直忙着处理原来老项目遗留的一些SQL优化问题,由于当初表的设计以及字段设计的问题,随着业务的增长,出现了大量的慢SQL,导致MySQL的CPU资源飙升,基于此,给大家简单分享下这些比较使用的易于学习和使用...
    99+
    2022-05-16
    mysql 索引 mysql索引使用 mysql组合索引失效
  • MySQL隐式类型转换导致索引失效的解决
    目录问题 复现 隐式转换 总结 参考 问题 在工作中发现,有一个接口只执行一条SQL查询语句,并且SQL明明使用了主键列,但是速度很慢。 在MySQL中EXPLAINN后发现,执行...
    99+
    2024-04-02
  • mysql回表致索引失效案例讲解
    简介 mysql的innodb引擎查询记录时在无法使用索引覆盖的场景下,需要做回表操作获取记录的所需字段。 mysql执行sql前会执行sql优化、索引选择等操作,mysql会预估各...
    99+
    2024-04-02
  • MySQL使用ReplicationConnection导致连接失效解决
    引言 mysql数据库读写分离,是提高服务质量的常用手段之一,而对于技术方案,有很多成熟开源框架或方案,例如:sharding-jdbc、spring中的AbstractRoutingDatasource、MySQL-R...
    99+
    2022-07-08
    MySQL Replication连接失效 MySQL ReplicationConnection
  • Mysql索引的使用-组合索引+跳跃条件
    关于MYSQL组合索引的使用,官方对下面的例子的说法是可以使用索引:KEY(key_part1,key_part2,key_part3)select .... from table wher...
    99+
    2024-04-02
  • MySQL使用ReplicationConnection导致连接失效怎么解决
    这篇文章主要介绍了MySQL使用ReplicationConnection导致连接失效怎么解决的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇MySQL使用ReplicationConnection导致连接失效怎...
    99+
    2023-07-02
  • ORDER BY导致索引使用不理想
    在MySQL中经常出现未按照理想情况使用索引的情况,今天记录一种Order by语句的使用导致未按预期使用索引的情况。 1.  问题现象 1.1 SQL语句: SELECT DISTINCT p.* FROM tb_name p...
    99+
    2016-07-15
    ORDER BY导致索引使用不理想
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作