位置: 编程技术 - 正文

MySQL隐式类型的转换陷阱和规则(mysql 隐式游标)

编辑:rootadmin

推荐整理分享MySQL隐式类型的转换陷阱和规则(mysql 隐式游标),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:mysql隐式类型转换,mysql 隐式游标,mysql隐式类型转换,mysql隐藏字段,mysql隐藏,mysql隐式转换索引失效,mysql隐式主键,mysql 隐式提交,内容如对您有帮助,希望把文章链接给更多的朋友!

前言

相信大家都知道隐式类型转换有无法命中索引的风险,在高并发、大数据量的情况下,命不中索引带来的后果非常严重。将数据库拖死,继而整个系统崩溃,对于大规模系统损失惨重。所以下面通过本文来好好学习下MySQL隐式类型的转换陷阱和规则。

1. 隐式类型转换实例

今天生产库上突然出现MySQL线程数告警,IOPS很高,实例会话里面出现许多类似下面的sql:(修改了相关字段和值)

用 explain 看了下扫描行数和索引选择情况:

t_tb1 表上有个索引uid_type_frid(f_col2_id,f_type) 、idx_corp_id_qq1id(f_col1_id,f_qq1_id) ,而且如果选择后者时,f_qq1_id的过滤效果应该很佳,但却选择了前者。当使用 hint use index(idx_corp_id_qq1id)时:

rows列达到w行,但问题也发现了:select_type应该是 range 才对,key_len看出来只用到了idx_corpid_qq1id索引的第一列。上面explain使用了 extended,所以show warnings;可以很明确的看到 f_qq1_id 出现了隐式类型转换:f_qq1_id是varchar,而后面的比较值是整型。

解决该问题就是避免出现隐式类型转换(implicit type conversion)带来的不可控:把f_qq1_id in的内容写成字符串:

扫描行数从减少为。

类似的还出现过一例:

优化后直接从扫描rows w行降为1。

借这个机会,系统的来看一下mysql中的隐式类型转换。

2. mysql隐式转换规则

2.1 规则

MySQL隐式类型的转换陷阱和规则(mysql 隐式游标)

下面来分析一下隐式转换的规则:

a. 两个参数至少有一个是 NULL 时,比较的结果也是 NULL,例外是使用 <=> 对两个 NULL 做比较时会返回 1,这两种情况都不需要做类型转换

b. 两个参数都是字符串,会按照字符串来比较,不做类型转换

c. 两个参数都是整数,按照整数来比较,不做类型转换

d. 十六进制的值和非数字做比较时,会被当做二进制串

e. 有一个参数是 TIMESTAMP 或 DATETIME,并且另外一个参数是常量,常量会被转换为 timestamp

f. 有一个参数是 decimal 类型,如果另外一个参数是 decimal 或者整数,会将整数转换为 decimal 后进行比较,如果另外一个参数是浮点数,则会把 decimal 转换为浮点数进行比较

g. 所有其他情况下,两个参数都会被转换为浮点数再进行比较

上面可以看出 + 'aa',由于操作符两边的类型不一样且符合第g条,aa要被转换成浮点型小数,然而转换失败(字母被截断),可以认为转成了 0,整数被转成浮点型还是它自己,所以 + 'aa' = 。

0.a转成double型也是被截断成0.,所以 + '0.a' = .。

等式比较也说明了这一点,'a'和'.0'转换后都等于 ,这也正是文章开头实例为什么没走索引的原因: varchar型的f_qq1_id,转换成浮点型比较时,等于 的情况有无数种如a、.b等待,MySQL优化器无法确定索引是否更有效,所以选择了其它方案。

但并不是只要出现隐式类型转换,就会引起上面类似的性能问题,最终是要看转换后能否有效选择索引。像f_id = '' 、f_mtime between '-- ::' and '-- ::'就不会影响索引选择,因为前者f_id是整型,即使与后面的字符串型数字转换成double比较,依然能根据double确定f_id的值,索引依然有效。后者是因为符合第e条,只是右边的常量做了转换。

开发人员可能都只要存在这么一个隐式类型转换的坑,但却又经常不注意,所以干脆无需记住那么多规则,该什么类型就与什么类型比较。

2.2 隐式类型转换的安全问题

implicit type conversion 不仅可能引起性能问题,还有可能产生安全问题。

假如应用前端没有WAF防护,那么下面的sql很容易注入:

攻击者更聪明一点: fname传入 A'+'B ,fpassword传入 ccc'+0 :

总结

标签: mysql 隐式游标

本文链接地址:https://www.jiuchutong.com/biancheng/348625.html 转载请保留说明!

上一篇:php mysql连接数据库实例(php连接mysql数据库的几种方式及区别)

下一篇:C3P0连接池+MySQL的配置及wait_timeout问题的解决方法(c3p0连接池提供了哪些方式来配置连接池的参数)

  • 电费发票隔月开如何做账
  • 一般纳税人企业所得税多久申报一次
  • 材料抵扣货款怎么写简单协议范本
  • 实收资本多长时间缴纳完?
  • 报税时资产总额怎么填
  • 公司基本户可以转私人账户吗
  • 定额征收需要建账吗
  • 营业成本在资产负债表哪里
  • 发票抬头写错了还能改吗
  • 一般纳税人用金蝶新建账套用什么会计制度好
  • 出差回来报销差旅费,补付现金的会计分录
  • 汇总记账凭证长什么样
  • 企业外购固定资产的成本包括购买价款和相关税费
  • 收到公益性捐赠所得税
  • 研发新产品成功案例简短
  • 未开票收入开票后怎么做账
  • 住宅租给公司办什么手续
  • 个人所得税手续费奖励办税人员文件
  • 企业所得税固定资产一次性扣除
  • 食用盐适用的增值税税率
  • 用于非增值税应交税费
  • 重点创业人群
  • 普通发票年份代码有什么具体含义?
  • 积分小技巧
  • 注册资本印花税税目是什么
  • 税控盘服务费每年都可以抵吗
  • 如果辞职了,能一次性拿到钱吗?
  • 产品质量认证的基本条件有哪些
  • 办公车辆的燃油费过路费怎么报销?
  • 没有系统U盘,电脑密码忘记了如何打开电脑
  • 收到服务费分录怎么写
  • 党政机关接收企业赞助的规定
  • 增值税出口服务包括什么
  • 蜡梅的养殖方法视频
  • 营改增建筑企业增值税
  • 印花税怎么核算的
  • 企业购进固定资产其入账成本应包括
  • 劳务佣金合法吗?
  • 企业新产品销售收入数据
  • 分配利润的会计处理
  • 企业期末结转本期实现的各项收入
  • 开发票的销售收入,正规的做账怎么做
  • 小微企业认定标准 税务
  • 个体工商户个税优惠政策2023
  • 个体经营所得可以用投资人申报吗
  • 对外捐赠的会计处理企业会计准则和小企业会计准则
  • 进项税额已经抵扣
  • 材料成本差异的超支与节约
  • 如何开具通用电子发票
  • sql server必知必会
  • 什么叫非限定性不定方程
  • 补计提去年所得税会影响当月资产
  • 先开票未发货要确认收入吗
  • 装卸费专票
  • 小规模无票收入纳税申报表怎么填
  • 员工备用金会计分录
  • 取现发放劳务费怎么做账
  • 公司的旅游费怎么处理
  • 总公司可以给子公司开票吗
  • 记账凭证附件的作用
  • 外商投资企业和外商独资企业
  • 利用MySQL统计一列中不同值的数量方法示例
  • ubuntu安装指南
  • netdrive mac
  • centos 查看服务
  • 硬盘安装操作系统出现,两个操作系统怎么选择
  • jucheck.exe是什么
  • window10电池
  • win7资源管理器停止工作怎么办
  • win10打开ie8
  • mac怎么利用蓝牙传输文件
  • linux系统如何安装软件包
  • vue router详解
  • jQuery formValidator表单验证
  • 安卓手机管家怎么关闭
  • unity3d游戏开发标准教程pdf
  • JavaScript中的方法名不区分大小写
  • 个体工商户税务年报网上怎么申报
  • 整备质量吨位数是什么意思
  • 企业如何网上申报税
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设