参考:
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中, in和or 会走索引吗相关推荐

  1. mysql数据库in函数查询是否走索引

    mysql数据库in函数查询是否走索引? IN 通常是走索引的,当IN后面的数据在数据表中超过30%的匹配时是全表的扫描,不会走索引,因此IN走不走索引与后面的数据量有关系! 昨天恰好在工作中遇到了这 ...

  2. mysql中怎样查看和删除唯一索引

    mysql中怎样查看和删除唯一索引. 查看唯一索引: show index from mytable;//mytable 是表名 查询结果例如以下: 查询到唯一索引后,怎样删除唯一索引呢,使用例如以下 ...

  3. MySql中的like和in走不走索引

    今天我们来实际操作一下 首先我们创建一个用户表进行测试 Like 在email字段上加一个索引来测试Like关键字 我们先来复习一下Like语句的几种写法 往大的方向说Like语句由两种写法,分别时% ...

  4. java怎么判断mysql中是否存在我们查找的索引_10张图告诉你,MySQL 是如何查找数据的?...

    在我们日常生活中经常会涉及到查找某个东西的场景,就比如说在一个学校里吧,我们想找出个子"最高的10个"同学,或者想查找姓名是"张三"的同学,又或者是查找学号是& ...

  5. mysql中条件查询加排序和索引的关系

    跟一个朋友,不错公司的主管交流时,对于mysql中条件查询和排序时 与索引的关系 mysql> explain select * from article where title='希望光伏企业 ...

  6. MySQL中like查询是否会使用索引

    MySQL中like查询使用索引 explain查看执行计划 实验过程 Like 不走索引的优化 explain查看执行计划 首先介绍一下mysql explain的各项内容: 序号 名称 含义 备注 ...

  7. mysql 执行delete的时候没走索引

    在项目中需要删除表里的过期数据,表设置了key为gmt_created, 但是在执行"delete from  table_name where to_days(gmt_created) & ...

  8. mysql binary like,在MySQL中为BINARY LIKE操作建立索引

    我知道varchar_pattern_ops存在于Postgresql中,用于在LIKE查询中进行基于索引的快速搜索,但是MySQL是否有类似的功能? 目前,我有一个Django-MySQL设置,其中 ...

  9. bcp 不能调用where 子句_技术分享 || Mysql中IS NULL、IS NOT NULL不能走索引?

    mysql中IS NULL.IS NOT NULL不能走索引? 不知道是啥原因也不知道啥时候, 江湖上流传着这么一个说法 mysql查询条件包含IS NULL.IS NOT NULL.!=.like ...

  10. mysql is null走索引_mysql中IS NULL、IS NOT NULL不能走索引?

    不知道是啥原因也不知道啥时候, 江湖上流传着这么一个说法 mysql查询条件包含IS NULL.IS NOT NULL.!=.like %* .like %*%,不能使用索引查询,只能使用全表扫描. ...

最新文章

  1. linux查看节点使用进程后退出,Linux通过端口号查看使用进程-结束进程
  2. 继国美处罚“摸鱼”员工后,网易出品之摸鱼计算器...
  3. MySQL分区表概念以及优缺点
  4. RabbitMQ学习之spring-amqp的重要类的认识
  5. MASM32使用教程
  6. shell 删除simatic_安装西门子软件时提示重启电脑的解决办法
  7. ORL数据集百度网盘
  8. IDEA切换分支 工作空间变化问题设置
  9. P3717 [AHOI2017初中组]cover
  10. iOS 斯坦福大学公开课地址
  11. 手机快播安卓版 Qvod player V1.0.19
  12. 云南怎么办理ICP经营许可证?云南办理ICP经营许可证有哪些要求?
  13. Elasticsearch应用案例1:百度
  14. Canvas如何等待所有图片加载完成才开始绘图
  15. PhpStorm修改字体和主题
  16. delphi 控件大全(确实很全)
  17. oracle安装成功验证
  18. 2021年南阳市五中高考成绩查询,2021年南阳高中录取分数线是多少及高中排名榜...
  19. 最新分布式训练深度学习框架
  20. choice() 函数

热门文章

  1. 51nod 1443 路径和树
  2. 简单描述机械硬盘和固态硬盘的区别
  3. 程序员入门消遣看看(二)
  4. 如何用计算机算分组数据方差,分组数据计算方差
  5. 安卓10修改系统ntp服务器,安卓修改ntp服务器地址
  6. 初学者入门web前端 C#基础知识:数组与集合
  7. ❤️欢迎关注我的公众号: 工程师看海❤️
  8. 磁盘片计算机术语,计算机术语 磁盘和光驱
  9. 名帖246 唐寅 行书《自书集贤宾等词卷》
  10. 看看斯坦福大学是如何教学生编程的