登录
首页 >  数据库 >  MySQL

MySQL 慢查询 —— 值类型与字段类型不一致的隐式转换

来源:SegmentFault

时间:2023-02-24 18:18:14 297浏览 收藏

本篇文章给大家分享《MySQL 慢查询 —— 值类型与字段类型不一致的隐式转换》,覆盖了数据库的常见基础知识,其实一个语言的全部知识点一篇文章是不可能说完的,但希望通过这些问题,让读者对自己的掌握程度有一定的认识(B 数),从而弥补自己的不足,更好的掌握它。

示例慢 SQL

SELECT * FROM task_engine_base_data WHERE outer_task_id = 1001871

场景上下文

  • 数据表结构现状
为减少阅读干扰,已去除与本案例无关的字段及索引定义

CREATE TABLE `task_engine_base_data` (
  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键ID',
  `task_type_id` int(11) NOT NULL DEFAULT '0' COMMENT '任务类型ID',
  `outer_task_id` varchar(64) NOT NULL DEFAULT '' COMMENT '外部任务ID',
  PRIMARY KEY (`id`),
  KEY `idx_outer_id_type_id` (`outer_task_id`,`task_type_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='子任务规则表';

原因分析

慢SQL的EXPLAIN

慢SQL的EXPLAIN

表中存在索引

SELECT * FROM task_engine_base_data WHERE outer_task_id = '1001871'

或者使用

SELECT * FROM task_engine_base_data WHERE outer_task_id=CAST(1001871 AS CHAR)

优化后的 SQL

SELECT * FROM task_engine_base_data WHERE outer_task_id = '1001871'
再看优化后的EXPLAIN

优化后SQL的EXPLAIN

知识总结

两个需要比较的值,基本类型不一样时,会发生转换。

整型与字符串的比较,两个值都会被转换成浮点数后再比较。

对索引列进行计算,会导致无法使用索引。

参考资料


感谢您的阅读,觉得内容不错,点个赞吧 😆
原文地址: https://shockerli.net/post/mysql-slow-sql-implicit-type-conversion/

以上就是本文的全部内容了,是否有顺利帮助你解决问题?若是能给你带来学习上的帮助,请大家多多支持golang学习网!更多关于数据库的相关知识,也可关注golang学习网公众号。

声明:本文转载于:SegmentFault 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>