接上文

在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. 【POJ2001】Shortest Prefixes

    Shortest Prefixes Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 18724   Accepted: 810 ...

  2. JVM垃圾回收(下)

    接着上一篇,介绍完了 JVM 中识别需要回收的垃圾对象之后,这一篇我们来说说 JVM 是如何进行垃圾回收. 首先要在这里介绍一下80/20 法则: 约仅有20%的变因操纵着80%的局面.也就是说:所有 ...

  3. 算法学习之剑指offer(九)

    一 题目描述 求1+2+3+...+n,要求不能使用乘除法.for.while.if.else.switch.case等关键字及条件判断语句(A?B:C). public class Solution ...

  4. 超实用的mysql分库分表策略,轻松解决亿级数据问题

    一.分库分表的背景 在数据爆炸的年代,单表数据达到千万级别,甚至过亿的量,都是很常见的情景.这时候再对数据库进行操作就是非常吃力的事情了,select个半天都出不来数据,这时候业务已经难以维系.不得已 ...

  5. Vue的介绍及安装和导入

    08.27自我总结 Vue的介绍及安装和导入 本质就是封装一些js 一Vue的介绍 进式 JavaScript 框架 通过对框架的了解与运用程度,来决定其在整个项目中的应用范围,最终可以独立以框架方式 ...

  6. Head First设计模式——观察者模式

    1.气象监测应用,错误示范 有一个气象站,分别有三个装置:温度感应装置,湿度感应装置,气压感应装置.WeathData对象跟踪气象站数据,WeathData有MeasurmentsChanged()方 ...

  7. Java学习之面试题整理

    1,java 基本数据类型有几种?哪几种?(面试题) 8种 byte short int long float double char boolean 2,int类型是几个字节?(面试题) 4字节 3 ...

  8. [BZOJ1054] 移动玩具

    1054: [HAOI2008]移动玩具 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 2741  Solved: 1537[Submit][Stat ...

  9. 使用Prometheus监控SpringBoot应用

    通过之前的文章我们使用Prometheus监控了应用服务器node_exporter,数据库mysqld_exporter,今天我们来监控一下你的应用.(本文以SpringBoot 2.1.9.REL ...

  10. mfc字符转码

    std::wstring UTF8ToUnicode(const std::string& utf8string) {  , utf8string.c_str(), -, NULL, );   ...