当前位置: 首页 > news >正文

MySQL中需要重视的隐式转换

这是学习笔记的第 1994 篇文章


在系统集成,对接的过程中,很多时候我们都会忽略数据类型的兼容性,导致在系统运转起来的时候,原本正常的流程会容易堵塞,其中一个潜在的原因就是因为数据隐式转换带来的额外代价,为了模拟这个问题,我们使用如下的方式创建表 test,分别指定列name为varchar和int类型,来对比查看隐式转换带来的性能问题。

初始化语句如下:

create table test(id int primary key,name varchar(20) ,key idx_name(name));

insert into test values(1,'10'),(2,'20');

然后我们使用如下的两条语句进行执行计划的对比测试。

l explain select * from test where id=20;

l explain select * from test where id=’20’;

在name列为字符类型时,得到的执行计划列表如下:

执行计划列

Where条件: name=20

where条件: name='20'

           id:

1

1

 select_type:

SIMPLE

SIMPLE

 partitions:

NULL

NULL

 type:

index

ref

possible_keys:

idx_name

idx_name

 key:

idx_name

idx_name

 key_len:

63

63

 ref:

NULL

const

 rows:

2

1

 filtered:

50

100

 Extra:

Using where; Using index

Using index


3 warnings (0.00 sec)

1 warning (0.00 sec)

可以很明显的看到,在name为字符串类型时,如果where条件为name=20,则走执行全索引扫描,查看warning信息会明确提示:

Message: Cannot use range access on index 'idx_name' due to type or collation conversion on field 'name'

而如果name列为int类型,使用同样的数据和方式,执行计划列表如下:

执行计划列

where条件: name=20

where条件: name='20'

  id:

1

1

 select_type:

SIMPLE

SIMPLE

  table:

test

test

  partitions:

NULL

NULL

  type:

ref

ref

possible_keys:

idx_name

idx_name

  key:

idx_name

idx_name

  key_len:

5

5

  ref:

const

const

  rows:

1

1

  filtered:

100

100

  Extra:

Using index

Using index


1 warning (0.00 sec)

1 warning (0.00 sec)

通过上面的测试可以看到,两种where条件的执行计划是一致的,从效率上来说,都是不错的。

对这种场景小结一下:对于数值类型的兼容性,需要尽可能保持一致,如果要反向转换为字符类型,是不建议的。

640?

相关文章:

  • 数据生命周期管理的初步设计
  • 颠覆我们的,可能就是那些差不多的事情
  • 因子分析的一个小例子
  • 最近在读的文章
  • 简单线性回归分析
  • 2000天带给我的回忆
  • 建模能力是进阶的必备技能
  • 推荐几个统计数据的网站
  • 相关分析的简单示例
  • 一些用户画像数据
  • 使用Shell脚本来解析MySQL元数据变化
  • 初来北京几年的精神状态
  • 磨刀不误砍柴工-流程梳理
  • 一个MySQL连接问题的优化过程
  • 认知的偏差
  • [译] 怎样写一个基础的编译器
  • 【每日笔记】【Go学习笔记】2019-01-10 codis proxy处理流程
  • 2017前端实习生面试总结
  • EventListener原理
  • happypack两次报错的问题
  • Javascript 原型链
  • Java的Interrupt与线程中断
  • java第三方包学习之lombok
  • Laravel 中的一个后期静态绑定
  • PAT A1092
  • React组件设计模式(一)
  • scrapy学习之路4(itemloder的使用)
  • 更好理解的面向对象的Javascript 1 —— 动态类型和多态
  • 简单基于spring的redis配置(单机和集群模式)
  • 简单实现一个textarea自适应高度
  • 每天10道Java面试题,跟我走,offer有!
  • 如何在 Tornado 中实现 Middleware
  • 小程序开发之路(一)
  • 责任链模式的两种实现
  • 《TCP IP 详解卷1:协议》阅读笔记 - 第六章
  • 宾利慕尚创始人典藏版国内首秀,2025年前实现全系车型电动化 | 2019上海车展 ...
  • 格斗健身潮牌24KiCK获近千万Pre-A轮融资,用户留存高达9个月 ...
  • 数据库巡检项
  • ​批处理文件中的errorlevel用法
  • ​人工智能书单(数学基础篇)
  • #鸿蒙生态创新中心#揭幕仪式在深圳湾科技生态园举行
  • (4.10~4.16)
  • (cljs/run-at (JSVM. :browser) 搭建刚好可用的开发环境!)
  • (done) ROC曲线 和 AUC值 分别是什么?
  • (PHP)设置修改 Apache 文件根目录 (Document Root)(转帖)
  • (板子)A* astar算法,AcWing第k短路+八数码 带注释
  • (二)fiber的基本认识
  • (附源码)ssm高校志愿者服务系统 毕业设计 011648
  • (十) 初识 Docker file
  • .NET Core IdentityServer4实战-开篇介绍与规划
  • .NET Core日志内容详解,详解不同日志级别的区别和有关日志记录的实用工具和第三方库详解与示例
  • .NET HttpWebRequest、WebClient、HttpClient
  • .NET Micro Framework 4.2 beta 源码探析
  • .net 打包工具_pyinstaller打包的exe太大?你需要站在巨人的肩膀上-VC++才是王道
  • .NET版Word处理控件Aspose.words功能演示:在ASP.NET MVC中创建MS Word编辑器