慢查询之当数据列是字符串类型,而查询参数是数字型时,不会使用索引

今天排查一个慢查询,想到了这篇文章:冯老师的困惑 —— 一个跑了两年的 BUG,详情如下

字段为 varchar 类型

数据列为 varchar 类型

当查询参数为 int 类型时,执行计划的索引使用情况

当查询参数为 int 类型时的索引情况

将查询参数改为字符串时

慢查询之当数据列是字符串类型,而查询参数是数字型时,不会使用索引

查询时间明显改善,降为 0.016s

测试完后,修改代码,$id 包裹上双引号

慢查询之当数据列是字符串类型,而查询参数是数字型时,不会使用索引

本作品采用《CC 协议》,转载必须注明作者和本文链接
welcome come back
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
讨论数量: 1

在先后两个公司,都遇到过这个问题, 而且都是在附件表的 attachmentable_id 上出现了这个问题, 字段是 varchar,而查询的时候默认是 int,最终导致查询结果不走索引,而附件表大多数时候比业务表还大,而且查询起来也很频繁,问题频出,第一次遇到的时候,也是没想到这个会影响,后面追本溯源,查找 MySQL 手册 的时候,上面确实提到了这个情况。

Comparison of dissimilar columns (comparing a string column to a temporal or numeric column, for example) may prevent use of indexes if values cannot be compared directly without conversion. For a given value such as 1 in the numeric column, it might compare equal to any number of values in the string column such as '1', ' 1', '00001', or '01.e1'. This rules out use of any indexes for the string column.

17小时前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!
未填写
文章
99
粉丝
25
喜欢
161
收藏
361
排名:314
访问:3.0 万
私信
所有博文
社区赞助商