也议MySQL中隐式转换

1. 环境说明

blog地址:http://blog.csdn.NET/hw_libo/article/details/39252427

RHEL 6.4 x86_64 + MySQL 5.6.19

测试表:

 

[sql]  view plain  copy
 
 print?在CODE上查看代码片派生到我的代码片
  1. MySQL [test]> show create table emp\G  
  2. *************************** 1. row ***************************  
  3.        Table: emp  
  4. Create Table: CREATE TABLE `emp` (  
  5.   `EMPNO` int(11) NOT NULL,  
  6.   `ENAME` varchar(15) NOT NULL,  
  7.   `JOB` varchar(15) NOT NULL,  
  8.   `MGR` int(11) DEFAULT '0',  
  9.   `HIREDATE` timestamp NULL DEFAULT NULL,  
  10.   `SAL` int(20) DEFAULT '0',  
  11.   `COMM` int(11) DEFAULT '0',  
  12.   `DEPTNO` int(11) NOT NULL,  
  13.   PRIMARY KEY (`EMPNO`),  
  14.   KEY `idx_deptno` (`DEPTNO`),  
  15.   KEY `idx_sal` (`SAL`),  
  16.   KEY `idx_comm` (`COMM`),  
  17.   KEY `idx_ename` (`ENAME`)  
  18. ) ENGINE=InnoDB DEFAULT CHARSET=utf8  
  19. 1 row in set (0.00 sec)  
[sql]  view plain  copy
 
 print?在CODE上查看代码片派生到我的代码片
  1. </pre><pre name="code" class="sql">MySQL [test]> select * from emp;  
  2. +-------+--------+-----------+------+---------------------+------+------+--------+  
  3. | EMPNO | ENAME  | JOB       | MGR  | HIREDATE            | SAL  | COMM | DEPTNO |  
  4. +-------+--------+-----------+------+---------------------+------+------+--------+  
  5. |  7369 | SMITH  | CLERK     | 7902 | 1980-12-17 00:00:00 |  800 | NULL |     20 |  
  6. |  7499 | ALLEN  | SALESMAN  | 7698 | 1981-02-20 00:00:00 | 1600 |  300 |     30 |  
  7. |  7521 | WARD   | SALESMAN  | 7698 | 1981-02-22 00:00:00 | 1250 |  500 |     30 |  
  8. |  7566 | JONES  | MANAGER   | 7839 | 1981-04-02 00:00:00 | 2975 |    0 |     20 |  
  9. |  7654 | MARTIN | SALESMAN  | 7698 | 1981-09-28 00:00:00 | 1250 | 1400 |     30 |  
  10. |  7698 | BLAKE  | MANAGER   | 7839 | 1981-05-01 00:00:00 | 2850 |    0 |     30 |  
  11. |  7782 | CLARK  | MANAGER   | 7839 | 1981-06-09 00:00:00 | 2450 |    0 |     10 |  
  12. |  7788 | SCOTT  | ANALYST   | 7566 | 1987-04-19 00:00:00 | 3000 | NULL |     20 |  
  13. |  7839 | KING   | PRESIDENT |    0 | 1981-11-17 00:00:00 | 5000 |    0 |     10 |  
  14. |  7844 | TURNER | SALESMAN  | 7698 | 1981-09-08 00:00:00 | 1500 |    0 |     30 |  
  15. |  7876 | ADAMS  | CLERK     | 7788 | 1987-05-23 00:00:00 | 1100 |    0 |     20 |  
  16. |  7900 | JAMES  | CLERK     | 7698 | 1981-12-03 00:00:00 |  950 |    0 |     30 |  
  17. |  7902 | FORD   | ANALYST   | 7566 | 1981-12-03 00:00:00 | 3000 |    0 |     20 |  
  18. |  7934 | MILLER | CLERK     | 7782 | 1982-01-23 00:00:00 | 1300 |    0 |     10 |  
  19. |  7936 | 23456  | BOSCO-DBA | 7788 | 2014-09-13 16:13:56 | 2450 |  800 |     10 |  
  20. +-------+--------+-----------+------+---------------------+------+------+--------+  
  21. 15 rows in set (0.00 sec)  

 

 

2. 数值类型(int)

首先提个问题,如上测试表emp中empno是主键,类型为int,那么:

 

[sql]  view plain  copy
 
 print?在CODE上查看代码片派生到我的代码片
  1. select * from emp where empno='7788';  

 

会产生隐式转换吗?

 

下面实验证明:

 

[sql]  view plain  copy
 
 print?在CODE上查看代码片派生到我的代码片
  1. MySQL [test]> select * from emp where empno=7788;  
  2. +-------+-------+---------+------+---------------------+------+------+--------+  
  3. | EMPNO | ENAME | JOB     | MGR  | HIREDATE            | SAL  | COMM | DEPTNO |  
  4. +-------+-------+---------+------+---------------------+------+------+--------+  
  5. |  7788 | SCOTT | ANALYST | 7566 | 1987-04-19 00:00:00 | 3000 | NULL |     20 |  
  6. +-------+-------+---------+------+---------------------+------+------+--------+  
  7. 1 row in set (0.00 sec)  
  8.   
  9. MySQL [test]> explain select * from emp where empno=7788;  
  10. +----+-------------+-------+-------+---------------+---------+---------+-------+------+-------+  
  11. | id | select_type | table | type  | possible_keys | key     | key_len | ref   | rows | Extra |  
  12. +----+-------------+-------+-------+---------------+---------+---------+-------+------+-------+  
  13. |  1 | SIMPLE      | emp   | const | PRIMARY       | PRIMARY | 4       | const |    1 | NULL  |  
  14. +----+-------------+-------+-------+---------------+---------+---------+-------+------+-------+  
  15. 1 row in set (0.00 sec)  
  16.   
  17. MySQL [test]> select * from emp where empno='7788';  
  18. +-------+-------+---------+------+---------------------+------+------+--------+  
  19. | EMPNO | ENAME | JOB     | MGR  | HIREDATE            | SAL  | COMM | DEPTNO |  
  20. +-------+-------+---------+------+---------------------+------+------+--------+  
  21. |  7788 | SCOTT | ANALYST | 7566 | 1987-04-19 00:00:00 | 3000 | NULL |     20 |  
  22. +-------+-------+---------+------+---------------------+------+------+--------+  
  23. 1 row in set (0.00 sec)  
  24.   
  25. MySQL [test]> explain select * from emp where empno='7788';  
  26. +----+-------------+-------+-------+---------------+---------+---------+-------+------+-------+  
  27. | id | select_type | table | type  | possible_keys | key     | key_len | ref   | rows | Extra |  
  28. +----+-------------+-------+-------+---------------+---------+---------+-------+------+-------+  
  29. |  1 | SIMPLE      | emp   | const | PRIMARY       | PRIMARY | 4       | const |    1 | NULL  |  
  30. +----+-------------+-------+-------+---------------+---------+---------+-------+------+-------+  
  31. 1 row in set (0.00 sec)  


可见,针对数据类型字段,即使类型不一致,并不影响是否使用索引,执行计划是一样的,不会产生隐式转换。但仍然建议在生产库中尽量避免出现这样的SQL。

 

 

注意:

数值类型有一种隐式转换,如果以数字开关的,后面的字符将被截断,只取前面的数字值,如果不以数字开关的将被置为0。如下:

 

[sql]  view plain  copy
 
 print?在CODE上查看代码片派生到我的代码片
  1. MySQL [test]> select * from emp where empno='7788ab12';   ## 这个就相当于empno=7788,后面的ab12将被截断,并且不影响索引的使用  
  2. +-------+-------+---------+------+---------------------+------+------+--------+  
  3. | EMPNO | ENAME | JOB     | MGR  | HIREDATE            | SAL  | COMM | DEPTNO |  
  4. +-------+-------+---------+------+---------------------+------+------+--------+  
  5. |  7788 | SCOTT | ANALYST | 7566 | 1987-04-19 00:00:00 | 3000 | NULL |     20 |  
  6. +-------+-------+---------+------+---------------------+------+------+--------+  
  7. 1 row in set, 1 warning (0.00 sec)  
  8.   
  9. MySQL [test]> show warnings;  
  10. +---------+------+----------------------------------------------+  
  11. Level   | Code | Message                                      |  
  12. +---------+------+----------------------------------------------+  
  13. | Warning | 1292 | Truncated incorrect DOUBLE value: '7788ab12' |  
  14. +---------+------+----------------------------------------------+  
  15. 1 row in set (0.00 sec)  
  16.   
  17. MySQL [test]> select * from emp where empno='ab7788';   ## 这个就相当于empno=0  
  18. Empty set (0.01 sec)  

 

 

3. 字符类型(varchar)

 

同样,针对测试表emp中的ename字段(varchar类型),上面有一辅助索引idx_ename,并且ename中有一个值是全数字的,若有这样的查询:

 

[sql]  view plain  copy
 
 print?在CODE上查看代码片派生到我的代码片
  1. select * from emp where ename=23456;  

上面的SQL会不会出现隐式转换呢?

 

 

下面实验证明:

 

[sql]  view plain  copy
 
 print?在CODE上查看代码片派生到我的代码片
  1. MySQL [test]> select * from emp where ename='23456';  
  2. +-------+-------+-----------+------+---------------------+------+------+--------+  
  3. | EMPNO | ENAME | JOB       | MGR  | HIREDATE            | SAL  | COMM | DEPTNO |  
  4. +-------+-------+-----------+------+---------------------+------+------+--------+  
  5. |  7936 | 23456 | BOSCO-DBA | 7788 | 2014-09-13 16:13:56 | 2450 |  800 |     10 |  
  6. +-------+-------+-----------+------+---------------------+------+------+--------+  
  7. 1 row in set (0.00 sec)  
  8.   
  9. MySQL [test]> explain select * from emp where ename='23456';   ## 正常来说,可以使用到索引idx_ename  
  10. +----+-------------+-------+------+---------------+-----------+---------+-------+------+-----------------------+  
  11. | id | select_type | table | type | possible_keys | key       | key_len | ref   | rows | Extra                 |  
  12. +----+-------------+-------+------+---------------+-----------+---------+-------+------+-----------------------+  
  13. |  1 | SIMPLE      | emp   | ref  | idx_ename     | idx_ename | 47      | const |    1 | Using index condition |  
  14. +----+-------------+-------+------+---------------+-----------+---------+-------+------+-----------------------+  
  15. 1 row in set (0.00 sec)  

 

[sql]  view plain  copy
 
 print?在CODE上查看代码片派生到我的代码片
  1. MySQL [test]> select * from emp where ename=23456;   ## 当varchar类型不对时,仍然是可以查出结果  
  2. +-------+-------+-----------+------+---------------------+------+------+--------+  
  3. | EMPNO | ENAME | JOB       | MGR  | HIREDATE            | SAL  | COMM | DEPTNO |  
  4. +-------+-------+-----------+------+---------------------+------+------+--------+  
  5. |  7936 | 23456 | BOSCO-DBA | 7788 | 2014-09-13 16:13:56 | 2450 |  800 |     10 |  
  6. +-------+-------+-----------+------+---------------------+------+------+--------+  
  7. 1 row in set, 14 warnings (0.00 sec)  
  8.   
  9. MySQL [test]> explain select * from emp where ename=23456;   ## 当varchar类型不匹配时,索引无效了,选择了全表扫描  
  10. +----+-------------+-------+------+---------------+------+---------+------+------+-------------+  
  11. | id | select_type | table | type | possible_keys | key  | key_len | ref  | rows | Extra       |  
  12. +----+-------------+-------+------+---------------+------+---------+------+------+-------------+  
  13. |  1 | SIMPLE      | emp   | ALL  | idx_ename     | NULL | NULL    | NULL |   15 | Using where |  
  14. +----+-------------+-------+------+---------------+------+---------+------+------+-------------+  
  15. 1 row in set (0.00 sec)  

 

 

可见,如果是字符类型,当出现类型不一致时,是会影响索引的使用的,会产生隐式转换的。

 

blog地址:http://blog.youkuaiyun.com/hw_libo/article/details/39252427

-- Bosco  QQ:375612082

---- END ----
-------------------------------------------------------------------------------------------------------
版权所有,文章允许转载,但必须以链接方式注明源地址,否则追究法律责任!

转载于:https://www.cnblogs.com/Dennis-mi/articles/6089747.html

【无线传感器】使用 MATLAB和 XBee连续监控温度传感器无线网络研究(Matlab代码实现)内容概要:本文围绕使用MATLAB和XBee技术实现温度传感器无线网络的连续监控展开研究,介绍了如何构建无线传感网络系统,并利用MATLAB进行数据采集、处理与可视化分析。系统通过XBee模块实现传感器节点间的无线通信,实时传输温度数据至主机,MATLAB负责接收并处理数据,实现对环境温度的动态监测。文中详细阐述了硬件连接、通信协配置、数据解析及软件编程实现过程,并提供了完整的MATLAB代码示例,便于读者复现和应用。该方案具有良好的扩展性和实用性,适用于远程环境监测场景。; 适合人群:具备一定MATLAB编程基础和无线通信基础知识的高校学生、科研人员及工程技术人员,尤其适合从事物联网、传感器网络相关项目开发的初学者与中级开发者。; 使用场景及目标:①实现基于XBee的无线温度传感网络搭建;②掌握MATLAB与无线模块的数据通信方法;③完成实时数据采集、处理与可视化;④为环境监测、工业测控等实际应用场景提供技术参考。; 阅读建:建读者结合文中提供的MATLAB代码与硬件连接图进行实践操作,先从简单的点对点通信入手,逐步扩展到多节点网络,同时可进一步探索数据滤波、异常检测、远程报警等功能的集成。
内容概要:本文系统讲解了边缘AI模型部署与优化的完整流程,涵盖核心挑战(算力、功耗、实时性、资源限制)与设计原则,详细对比主流边缘AI芯片平台(如ESP32-S3、RK3588、Jetson系列、Coral等)的性能参数与适用场景,并以RK3588部署YOLOv8为例,演示从PyTorch模型导出、ONNX转换、RKNN量化到Tengine推理的全流程。文章重点介绍多维度优化策略,包括模型轻量化(结构选择、输入尺寸调整)、量化(INT8/FP16)、剪枝与蒸馏、算子融合、批处理、硬件加速预处理及DVFS动态调频等,显著提升帧率并降低功耗。通过三个实战案例验证优化效果,最后提供常见问题解决方案与未来技术趋势。; 适合人群:具备一定AI模型开发经验的工程师,尤其是从事边缘计算、嵌入AI、计算机视觉应用研发的技术人员,工作年限建1-5年;熟悉Python、C++及深度学习框架(如PyTorch、TensorFlow)者更佳。; 使用场景及目标:①在资源受限的边缘设备上高效部署AI模型;②实现高帧率与低功耗的双重优化目标;③掌握从芯片选型、模型转换到系统级调优的全链路能力;④解决实际部署中的精度损失、内存溢出、NPU利用率低等问题。; 阅读建:建结合文中提供的代码实例与工具链(如RKNN Toolkit、Tengine、TensorRT)动手实践,重点关注量化校准、模型压缩与硬件协同优化环节,同时参考选型表格匹配具体应用场景,并利用功耗监测工具进行闭环调优。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值