MySQL中, in和or 会走索引吗

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS PostgreSQL,集群系列 2核4GB
简介: MySQL中, in和or 会走索引吗

参考:

mysql or走索引吗_加了索引,mysql查询就一定会用吗?

InnoDB行锁变表锁的原因可能有哪些?(待总结...)

1.MySQL in 会用到索引吗?

       不一定,要看情况,具体是由MySQL优化器内部决定是全表扫描还是索引查找,用效率较高的一种方式

    1. 针对索引字段的唯一性不高的情况下(索引的"区分度"低),优化器可能会选择全表扫描,而不是走索引。这可能是因为等值查询符合条件的记录太多了,导致了mysql认为全表扫描比用索引查找更快。
      比如你对唯一性不高的字段(如性别:男/女)加了索引,这样通过索引去查找可能还需回表,还不如直接全表扫描!
    2. in中的数据量较大时,基本就不走索引了。如果你索引字段是一个unique,in可能就会用到索引。
    3. 如果你一定要用索引,可以用 force index。可能也和MySQL版本有关(5.6以后有做in的查询优化)。

           注:如果是 5.5 之前的版本确实不会走索引的,在 5.5 之后的版本,MySQL 做了优化。MySQL 在 2010 年发布 5.5 版本中,优化器对 in 操作符可以自动完成优化,针对建立了索引的列可以使用索引,没有索引的列还是会走全表扫描。

    2.MySQL or 会用到索引吗?

           不一定,要看情况。or走索引与否,还和优化器的预估有关,就算连接条件都设置了索引,也可能因为回表导致索引失效。

           索引优化器的存在,就是找到一个索引扫描行数最少的方案去执行语句。那么扫描行数怎么来判断的?是逐行统计数据表的数据吗?其实并不是,而是根据统计信息来预估的值,这个统计信息就是我们常说的索引的“区分度”。

           显然,一个索引上不同的值越多,这个索引的区分度就越好。我们把一个索引上不同的值的个数,称之为 "索引基数"。也就是说,基数越大,索引的区分度就越好,执行查询的行数就越少。如何查看索引基数呢?使用 show index from 表名,其中cardinality字段显示的就是索引的基数。

           扩展:MySQL 是怎样得到索引基数的呢?不感兴趣的小伙伴可以飘过啦~

           索引基数 = 采样统计*页数。采样统计就是避免把整张表取出来一行行统计做精准计算,以免消耗系统性能。在采样统计时,InnoDB默认会选择 N 个数据页,统计这些页面上的 "对应索引字段" 上不同值的个数,得到一个平均值,然后用平均值乘以这个索引的页面数,就得到了这个索引的基数。统计信息不是固定不变的,他会随着数据表的变化而变化。当变更的数据行数超过 1/M 的时候,会自动触发重新做一次索引统计。

           建议:在使用前最好还是先用 explain 来试试到底sql语句走不走索引,然后选择较优的sql

    相关实践学习
    如何在云端创建MySQL数据库
    开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
    全面了解阿里云能为你做什么
    阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
    目录
    相关文章
    |
    21天前
    |
    存储 自然语言处理 关系型数据库
    MySQL高级篇——索引的创建与设计原则
    索引的分类与使用、MySQL8.0索引新特性、适合创建索引的情况、不适合创建索引的情况
    MySQL高级篇——索引的创建与设计原则
    |
    21天前
    |
    存储 SQL 关系型数据库
    MySQL高级篇——索引失效的11种情况
    索引优化思路、要尽量满足全值匹配、最佳左前缀法则、主键插入顺序尽量自增、计算、函数导致索引失效、类型转换(手动或自动)导致索引失效、范围条件右边的列索引失效、不等于符号导致索引失效、is not null、not like无法使用索引、左模糊查询导致索引失效、“OR”前后存在非索引列,导致索引失效、不同字符集导致索引失败,建议utf8mb4
    MySQL高级篇——索引失效的11种情况
    |
    1月前
    |
    存储 关系型数据库 MySQL
    MySQL基础:索引
    MySQL中的索引是一种数据结构,能大幅提升数据库查询效率和减少I/O成本,类似于书的目录帮助快速定位内容。其优势包括提高检索效率和降低排序成本,但会占用空间并影响更新表的效率。鉴于查询远多于更新,索引仍被推荐使用。索引分为多种类型,如B+树和哈希索引,其中B+树因其较低的高度和稳定的查询开销成为常用选择。创建和删除索引需谨慎,以免影响性能。
    42 4
    MySQL基础:索引
    |
    21天前
    |
    存储 SQL 关系型数据库
    【MySQL调优】如何进行MySQL调优?从参数、数据建模、索引、SQL语句等方向,三万字详细解读MySQL的性能优化方案(2024版)
    MySQL调优主要分为三个步骤:监控报警、排查慢SQL、MySQL调优。 排查慢SQL:开启慢查询日志 、找出最慢的几条SQL、分析查询计划 。 MySQL调优: 基础优化:缓存优化、硬件优化、参数优化、定期清理垃圾、使用合适的存储引擎、读写分离、分库分表; 表设计优化:数据类型优化、冷热数据分表等。 索引优化:考虑索引失效的11个场景、遵循索引设计原则、连接查询优化、排序优化、深分页查询优化、覆盖索引、索引下推、用普通索引等。 SQL优化。
    168 15
    【MySQL调优】如何进行MySQL调优?从参数、数据建模、索引、SQL语句等方向,三万字详细解读MySQL的性能优化方案(2024版)
    |
    21天前
    |
    存储 缓存 关系型数据库
    MySQL高级篇——存储引擎和索引
    MyISAM:不支持外键和事务,表锁不适合高并发,只缓存索引,内存要求低,查询快MyISAM提供了大量的特性,包括全文索引、压缩、空间函数(GIS)等,但MyISAM不支持事务、行级锁、外键,有一个毫无疑问的缺陷就是崩溃后无法安全恢复。5.5之前默认的存储引擎优势是访问的速度快,对事务完整性没有要求或者以SELECT、INSERT为主的应用针对数据统计有额外的常数存储。故而 count(*) 的查询效率很高表名.frm 存储表结构;表名.MYD 存储数据 (MYData);
    MySQL高级篇——存储引擎和索引
    |
    21天前
    |
    存储 关系型数据库 MySQL
    MySQL高级篇——覆盖索引、前缀索引、索引下推、SQL优化、主键设计
    覆盖索引、前缀索引、索引下推、SQL优化、EXISTS 和 IN 的区分、建议COUNT(*)或COUNT(1)、建议SELECT(字段)而不是SELECT(*)、LIMIT 1 对优化的影响、多使用COMMIT、主键设计、自增主键的缺点、淘宝订单号的主键设计、MySQL 8.0改造UUID为有序
    MySQL高级篇——覆盖索引、前缀索引、索引下推、SQL优化、主键设计
    |
    5天前
    |
    存储 关系型数据库 MySQL
    MySQL索引失效及避免策略:优化查询性能的关键
    MySQL索引失效及避免策略:优化查询性能的关键
    22 3
    |
    10天前
    |
    关系型数据库 MySQL 数据库
    MySQL删除全局唯一索引unique
    这篇文章介绍了如何在MySQL数据库中删除全局唯一的索引(unique index),包括查看索引、删除索引的方法和确认删除后的状态。
    32 9
    |
    5天前
    |
    存储 SQL 关系型数据库
    MySQL 的索引是怎么组织的?
    MySQL 的索引是怎么组织的?
    11 1
    |
    5天前
    |
    存储 关系型数据库 MySQL
    MySQL索引的概念与好处
    本文介绍了MySQL存储引擎及其索引类型,重点对比了MyISAM与InnoDB引擎的不同之处。文中详细解释了InnoDB引擎的自适应Hash索引及聚簇索引的特点,并阐述了索引的重要性及使用原因,包括提升数据检索速度、实现数据唯一性等。最后,文章还讨论了主键索引的选择与页分裂问题,并提供了使用自增字段作为主键的建议。
    MySQL索引的概念与好处
    下一篇
    无影云桌面