接上文

在MySQL中,有一些语句即使逻辑相同,执行起来的性能差异确实极大的。
还记得我们上文中的结论吗:如果想使用索引树搜索功能,就不能使用数据库函数来处理索引字段值,而是在不改变索引字段值的同时,自己通过SQL语句来实现逻辑。
而本文中,我们将基于上述结论进行分析,为什么隐式替换,不能使用索引树搜索功能。

首先,什么是隐式替换?

隐式替换,指的是不用我们主动去转型的数据类型转换规则。以Java代码为例:
int intNum = 3;
double doubleNum = 3.5;
intNum = (int) doubleNum;
doubleNum = intNum;
double转int,由于丢失精度,所以要求我们去主动进行转型,而int转double,系统将进行隐式替换
下面这条SQL就用到了隐式替换:
select * from tradelog where tradeid=123;
对优化器而言,这个语句相当于:
select * from tradelog where CAST(tradid AS signed int) = 123;
最常见的隐式替换就是字符串和数字之间的替换,MySQL会将字符串隐式替换为数字。
我们在表中再插入5条测试数据,执行上述SQL:
insert into tradelog (id,tradeid,t_modified) values(6,'','2017-03-15');
insert into tradelog (id,tradeid,t_modified) values(7,'','2017-06-11');
insert into tradelog (id,tradeid,t_modified) values(8,'','2017-07-03');
insert into tradelog (id,tradeid,t_modified) values(9,'','2018-08-11');
insert into tradelog (id,tradeid,t_modified) values(10,'','2018-09-12');
我们可以通过explain命令,对这行语句的执行结果进行分析。由于对索引字段值进行了函数处理,所以这条SQL会做全索引扫描。

同理,如果想使用索引树查找,则需要去除隐式替换(其实也就是去除加载索引值上的函数):
select * from tradelog where tradeid="123";
接着我们使用explain对其进行分析,此时采用了树搜索的方式,只查找了2行数据:
这里再抛出一个问题,下面这条语句是否可以使用树搜索的方式进行数据的查找?
select * from tradelog where id = "6";
答案是可以的,是因为MySQL的数据转换会将字符串类型值转换为数字,对于优化器而言,这条SQL等同于:
select * from tradelog where id = cast(6 as signed int);
可以看出,函数是加在搜索值上的,并没有加在索引值上,所以还可以使用树搜索的方式进行查找。
我们使用explain来看一下SQL执行结果:
所以并不是所有的隐式替换都不能使用索引的树查找,需要具体分析(函数的位置;字符串和数字同时存在,字符串会转换成数字),当然,不在SQL中出现隐式替换是最好的方式,便于记忆。
 
 

为什么我加了索引,SQL执行还是这么慢(二)?的更多相关文章

  1. 为什么我加了索引,SQL执行还是这么慢(一)?

    在MySQL中,有一些语句即使逻辑相同,执行起来的性能差异确实极大的. 先抛出一个结论:如果想使用索引树搜索功能,就不能使用数据库函数来处理索引字段值,而是在不改变索引字段值的同时,自己通过SQL语句 ...

  2. hint不当索引,影响多表连接方式,最终导致SQL执行缓慢

    需求:一个SQL执行特别慢,无法返回结果,需要进行优化,最终返回结果即可. 一.SQL分析 二.尝试执行,观测执行计划 三.修改SQL 四.问题总结 一.SQL分析 )SQL文本,执行时间,执行用户 ...

  3. MySQL中的索引、左连接、右连接、join、sql执行顺序

    逻辑架构: 1.连接层 2.服务层 3.引擎层(插拔式) 4.存储层 存储引擎: 常用的有:MyISAM.InnoDB 查看命令:show variables like '%storage_engin ...

  4. log4j.xml简单配置实现在控制台打印sql执行语句【加注释】

    转: log4j.xml简单配置实现在控制台打印sql执行语句 2017年09月27日 13:02:34 艾然丶 阅读数 8804   版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协 ...

  5. SQL 执行计划(二)

    最近总想整理下对MSSQL的一些理解与感悟,却一直没有心思和时间写,晚上无事便写了一篇探索MSSQL执行计划,本文讲执行计划但不仅限于讲执行计划. 网上的SQL优化的文章实在是很多,说实在的,我也曾经 ...

  6. SQL优化 MySQL版 -分析explain SQL执行计划与Type级别详解

    type索引类型.类型 作者 : Stanley 罗昊 [转载请注明出处和署名,谢谢!] 注:看此文章前,需要有一定的Mysql基础或观看上一篇文章,该文章传送门: https://www.cnblo ...

  7. SQl 执行效率总结

    SQL执行效率总结 1.关于SQL查询效率,100w数据,查询只要1秒,与您分享: 机器情况 p4: 2.4 内存: 1 G os: windows 2003 数据库: ms sql server 2 ...

  8. 【转】导致SQL执行慢的原因

    索引对大数据的查询速度的提升是非常大的,Explain可以帮你分析SQL语句是否用到相关索引. 索引类似大学图书馆建书目索引,可以提高数据检索的效率,降低数据库的IO成本.MySQL在300万条记录左 ...

  9. SQL执行计划解读

    声明 5.6中desc看不到show warnings,也看不到filtered列 5.7的desc等于5.6的desc extended,这样可以看show warnings,5.6中filtere ...

随机推荐

  1. TP框架配合jquery进行3种方式的多图片上传

    用的TP5.1框架+jquery 一 使用form表单方式进行多图片上传 html代码: <form action="../admin/admin/cs" enctype=& ...

  2. 6.InfluxDB-InfluxQL基础语法教程--GROUP BY子句

    本文翻译自官网,官网地址:(https://docs.influxdata.com/influxdb/v1.7/query_language/data_exploration/) GROUP BY子句 ...

  3. BZOJ 4621: Tc605

    Description 最初你有一个长度为 N 的数字序列 A.为了方便起见,序列 A 是一个排列. 你可以操作最多 K 次.每一次操作你可以先选定一个 A 的一个子串,然后将这个子串的数字全部变成原 ...

  4. Spring5源码解析6-ConfigurationClassParser 解析配置类

    ConfigurationClassParser 在ConfigurationClassPostProcessor#processConfigBeanDefinitions方法中创建了Configur ...

  5. web开发基础之HTTP协议

    HTTP协议 HTTP协议简介 超文本传输协议(英文:HyperText Transfer Protocol,缩写:HTTP)是一种用于分布式.协作式和超媒体信息系统的应用层协议.HTTP是万维网的数 ...

  6. PHP 组件注册的例子

    <?php namespace Test; abstract class Plugin { protected $pluginName = null; abstract public funct ...

  7. opencv::模板匹配(Template Match)

    模板匹配介绍 模板匹配就是在整个图像区域发现与给定子图像匹配的小块区域. 所以模板匹配首先需要一个模板图像T(给定的子图像) 另外需要一个待检测的图像-源图像S 工作方法,在带检测图像上,从左到右,从 ...

  8. 【阿里云IoT+YF3300】6.物联网设备报警配置

    纵然5G时代已经在时代的浪潮中展现出了它的身影,但是就目前的物联网环境中,网络问题仍旧是一个比较突出的硬伤.众所周知,在当前的物联网规划中,与其说是实现万物互联,倒不如说是行业指标数据监控.对于一些特 ...

  9. SSH框架项目配置和启动的加载顺序及请求的执行顺序

    1:======配置和启动====== (1)配置web.xml 配置<context-param>,其中内容为Spring的配置文件applicationContext.xml.注意&l ...

  10. 楼上请让路 RoarCTF2019 Writeup

    Misc 签到题 RoarCTF{签到!!!} 黄金六年 文件尾部有一段base64,解码为16进制可以看到是一个压缩包 打开压缩包需要密码 使用pr抽帧 可以看到部分帧中有二维码,依次扫码即可得到k ...