我们在写sql的时候,经常用到in,in后面跟一堆常量列表,如id。有人说in的效率很高,而有人说很低;有人说in能使用索引,还有人说in不能使用索引。。。
到底是一个怎样的情况呢?我们分析以下几种情况
在这之前,我们先了解一下explain的几种type类型(本次分析即参照type类型),按照性能从高到低:

const:表中的一个记录的最大值能够匹配这个查询(索引可以是主键或惟一索引)。因为只有一行,这个值实际就是常数,因为MYSQL先读这个值然后把它当做常数来对待

eq_ref:在连接中,MYSQL在查询时,从前面的表中,对每一个记录的联合都从表中读取一个记录,它在查询使用了索引为主键或惟一键的全部时使用

ref:这个连接类型只有在查询使用了不是惟一或主键的键或者是这些类型的部分(比如,利用最左边前缀)时发生。对于之前的表的每一个行联合,全部记录都将从表中读出。这个类型严重依赖于根据索引匹配的记录多少—越少越好

range:这个连接类型使用索引返回一个范围中的行,比如使用>或<查找东西时发生的情况

index: 这个连接类型对前面的表中的每一个记录联合进行完全扫描(比ALL更好,因为索引一般小于表数据)

ALL:这个连接类型对于前面的每一个记录联合进行完全扫描,这一般比较糟糕,应该尽量避免

一,in后面只有1个值
1.1 对于主键或者唯一索引,那么type=const,这种性能最高,表示表中只有1个记录能满足查询

1.2 对于普通索引、或者联合主键,type=ref

1.3 对于普通字段,type=all,这种性能最差

二,in后面多余1个值,但少于某一个值,这个值具体是多少,之后会揭晓。
这时,不管是主键,还是唯一索引,还是普通索引,type=range

但是在这里需要注意的一个特例是:当你的索引的Cardinality属性比较低时,type=all,意思就是这个索引的区分度很低,建立的意义不大,
这时他的执行计划type=all,mysql认为走这个索引还不如全表扫描:

到底Cardinality处于什么水平时,性能最好?一般认为这个值越接近count(*),性能最好。而对于像性别这种字段,就没必要加索引了。

三,相对于第二种情况,当in后面的值多于某一个值,会导致扫描全表。这个经验值我目前不能确定,咨询过相关DBA,他们也不能给出其经验值
3.1 test1表总共27条数据,当in后面的值少于8个时,type=range,而当超过8个时,type=all,如下:

3.2 这个t_word_cost表,总共有38244条数据,word_id上有索引,我测试了一把,当in后面不超过5千多或者6千多时,type=range,这是什么意思?
因为令我不解的是,这个值还不确定,它是波动的,我执行了好多次,有时候是5千多,有时候是6千多,或者其他值

通过对test1、t_word_cost表进行测试,我确实没有找出规律来,我原来妄想,通过大量实践得出一个经验值,然后通过经验值来判断到底in后面的个数占count(*)百分比多少的时候,能走索引,看来我徒劳了。

既然不能得出经验值,那我们只有在实际应用环境下具体选择解决方案了。
譬如我这次操作t_word_cost表,in后面值的个数都超过count(*)了,如果一次性全部写进in后面,一次查询所耗时间是30-40s左右!
根据上面我分析的结果,貌似我应该选择5000作为临界值,然后分批、多次查询,这样性能应该最高。但实际情况是这样吗?
通过我在程序中不断地人肉测试发现,并不是5000耗时最少,选择2000或者2500时,总体耗时最少,至于为什么,可能与内存、频繁的数据库连接有关吧,
因为我们知道,内存、IO都会影响整体性能,所以怎样平衡这个度需要自己把握。

转载于:https://www.cnblogs.com/kabi/p/5457294.html

MySQL中in(常量列表)的执行计划相关推荐

  1. [转]Mysql中的SQL优化与执行计划

    From : http://religiose.iteye.com/blog/1685537 一,如何判断SQL的执行效率? 通过explain 关键字分析效率低的SQL执行计划. 比如: expla ...

  2. oracle清除执行计划,Oracle数据库9I中清除特定表相关执行计划案例

    天萃荷净 在9i中因为某个执行计划因为Oracle Peeking绑定变量的控制导致现有的执行计划不正确,需要清除掉这条sql语句的执行计划.在10g中提供了dbms_shared_pool.purg ...

  3. mysql使用常量列_MySQL 执行计划

    1.使用explain语句去查看分析结果 如explain select * from test1 where id=1; 会出现:id selecttype table type possible_ ...

  4. 【mysql系列】细谈explain执行计划之“谜”

    目录 理论Part 概念 实践Part id select_type table type possible_keys key key_len ref rows filtered Extra 总结 聊 ...

  5. MySQL——通过EXPLAIN分析SQL的执行计划

    在MySQL中,我们可以通过EXPLAIN命令获取MySQL如何执行SELECT语句的信息,包括在SELECT语句执行过程中表如何连接和连接的顺序. 下面分别对EXPLAIN命令结果的每一列进行说明: ...

  6. MySQL之导入导出视图索引执行计划

    目录 一.导入导出 数据的导入导出的三种方式 1.使用工具,类似sqlyog.Navicat等导入导出 delete与truncate 的区别 2.使用mysqldump导入导出(以命令的形式) 导出 ...

  7. mysql中一条update的执行过程

    一.Server层阶段: 连接器:负责跟客户端建立连接.获取权限.维持和管理连接 分析器:验证通过以后,分析器会对该语句分析, 判断是否语法有错误等. 优化器:选择索引,生成执行计划. 执行器:根据优 ...

  8. mysql+优化器+软解析_MySQL执行计划 - osc_93u9qofu的个人空间 - OSCHINA - 中文开源技术交流社区...

    执行计划,SQL语句过来,会先解析,词法解析,语法解析,之后生成执行计划,计划上会算出使用全盘扫秒还是依靠索引, mysql不缓冲执行计划,oracle有 体系结构 1.优化器--->执行计划 ...

  9. MySQL中SQL生命周期与执行流程

    [1]MySQL执行流程 从MySQL的逻辑架构来看,如下图所示. 这里首先我们分析一下查询缓存,其在MySQL8中已经被抛弃. ① 查询缓存 Server如果在查询缓存中发现了这条SQL语句,就会直 ...

  10. Mysql中explain命令查看语句执行概况

    Mysql中可以使用explain命令查看查询语句的执行方式,使用方法举例:explain + 查询语句 例如:explain select * from user_info 几个重要的字段说明: t ...

最新文章

  1. 不需要程序员,产品经理也能10分钟打造一个深度学习模型
  2. Mask R-CNN 源代码终上线,Facebook 开源目标检测平台—Detectron
  3. R语言为dataframe添加新的数据列(横向拼接、Appending columns,Unioning columns):使用R原生方法、data.table、dplyr等方案
  4. Mui --- app与服务器之间的交互原理、mui ajax使用
  5. 【Quartz】Spring3.2.9 + Quqrtz2.2.1 实现定时实例
  6. SharePoint服务器连接配置数据库的连接字符串保存位置
  7. 动态类型语言和静态类型语言
  8. sklearn_收入模型
  9. LINUX SAN 500G重新分区、格式化,后成功恢复数据90%
  10. Typora入门(中文版)
  11. 复制含有随机指针节点的链表
  12. 宏excel怎么计算机,excel宏的使用/EXCEL 如何关闭宏
  13. 经纬度坐标转换xy坐标 python_Python 高斯坐标转经纬度算法
  14. 运营者想针对公众号吸粉做一些运营活动,怎么做?
  15. 计算机进行运算时为什么采用二进制数,计算机中为什么采用二进制
  16. vue上线后图片不显示_vue开发之图片加载不出来问题解决
  17. 西班牙、阿根廷和委内瑞拉的五所大学提供加密货币课程
  18. 数据分析概念与职业操守
  19. Python数据可视化——图型参数介绍
  20. AutoCAD .NET: 遍历模型空间

热门文章

  1. redhat7配置本地源
  2. 区块链基础知识系列第5课 Hyperledger fabric1.0网络中transaction产生以及流转过程
  3. java push_back,将一个结构push_back()一个向量
  4. python堆堆乐教程_python堆排序,详细过程图和讲解,这样做小白都会
  5. nfa确定化 dfa最小化_深度学习中的优化:梯度下降,确定全局最优值或与之接近的局部最优值...
  6. 页面放在哪_seo页面怎么优化?seo页面优化有哪些方法?
  7. db2 删除索引_MySQL 选错索引的原因是什么?
  8. matlab中描绘简单曲线和点
  9. 数学之美 系列七 -- 信息论在信息处理中的应用
  10. 2048(lj模拟)