MySQL45讲之函数转换导致不使用索引

本文介绍了由于函数转换而不使用索引的三个问题。请注意,不使用索引意味着不使用树搜索,而是使用全表扫描索引树。

[En]

This article introduces three problems that do not use indexes due to function conversion. * Note that not using an index means not using a tree search, but a full table scan index tree. *

显式使用函数

比如 select count(*) from tradelog where month(t_modified)=7;,在 t_modified 字段上建立了普通索引。
索引对于 t_modified 是有序的,但是对于 month(t_modified) 不是有序的,所以优化器规定,当遇到使用函数对字段进行操作后,不会使用树搜索,而是全表扫描。这里因为只查询符合条件的行数,并且 t_modified 索引树比主键索引树小,所以使用了索引覆盖。

类型转换

比如 select * from tradelog where tradeid=110717;,其中,tradeid 字段是 varchar 类型。
因为 tradeid 和 110717 两个类型不一致,所以需要类型转换。那是转换成字符串呢还是数字呢?
一个简单的判断方法是,执行 select 9 < '10';,如果返回 1,说明转换成数字,否则转换成字符串。

于是,这条语句等价于 select * from tradelog where CASE(tradeid AS signed int)=110717;,也不能使用树搜索,尽管 tradeid 字段有索引。

不过,对于 select * from t where id = '1'; ,会使用主键索引,因为等价于 select * from t where id = CAST('1' AS signed int);

编码转换

比如 select * from trade_detail where tradeid=$L2.tradeid.value;,其中 tradeid 是 utf8 编码,而 $L2.tradeid.value 是 utf8mb64 编码。
因为 utf8mb64 是 utf8 的超集,所以查询时需要将 tradeid 字段编码转换成 utf8mb64。

如果要优化这个场景,在线上数据量不大且可以做这个 DDL 时,可以将 trade_detail 表的 tradeid 字段设为 utf8mb64 编码。如果不能做这个 DDL 操作,可以采用 select * from trade_detail where CONVERT(tradeid USING utf8)=$L2.tradeid.value;

在遇到显式或者隐式使用函数应用字段时,优化器将不会选择索引,而是采用全表扫描的方式。并且,对于像 where id+1=1000 的表达式同样不会采用索引,写成 where id = 1000-1 就可以,这里感觉优化器偷懒了。

Original: https://www.cnblogs.com/flowers-bloom/p/mysql45-function-conversion.html
Author: flowers-bloom
Title: MySQL45讲之函数转换导致不使用索引

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/508122/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • DDD(Domain Driver Design)领域驱动模型

    Domain Primitive(DP) DP概念DP 是 DDD 中的一个基础概念,是 DDD 中可以执行的一个最小单元,最直接的体现是,将业务相关的参数定义在一个特定的领域中(…

    数据库 2023年6月6日
    0132
  • 配置 Windows Terminal 步骤

    配置 Windows Terminal 的步骤 前提:在微软商店下载两个软件 Windows Terminal PowerShell oh-my-posh 配置 oh my pos…

    数据库 2023年6月6日
    0130
  • 【MySQL】笔记(1)— MySQL 数据库概述;常用 DOS命令,SQL命令(初步);

    sql、DB、DBMS分别是什么,他们之间的关系? DB: DataBase(数据库,数据库实际上在硬盘上以文件的形式存在) DBMS:DataBase Management Sy…

    数据库 2023年5月24日
    082
  • Redis学习(1)—Redis概述

    什么是NoSQL NoSQL:Not Only SQL,意思不仅仅是SQL,它是属于 非关系型数据库。那什么是关系型数据库?数据结构是一种有行有列的数据库。 NoSQL数据库是为了…

    数据库 2023年6月14日
    082
  • JAVA编程练习01作业

    2 、 输入一个圆半径(r),计算并输出圆的面积和周长。 3 、输入一个三位正整数n,输出其个位、十位和百位上的数字。 4 、根据性别和体重计算输血量。女性体重不超过50kg的输血…

    数据库 2023年6月11日
    0156
  • SpringBoot自动配置

    @SpringBootApplication SpringBoot应用标注在某个类上说明这个类是SpringBoot的主配置类,SpringBoot就应该运行这个类的main方法来…

    数据库 2023年6月16日
    096
  • MySQL的FIND_IN_SET函数

    语法:FIND_IN_SET(str,strlist) https://www.cnblogs.com/xiaoxi/p/5889486.html Original: https:…

    数据库 2023年6月16日
    058
  • 1 请谈谈面向对象的三大特征?

    隐藏对象的属性和实现细节,仅对外公开接口,控制程序中属性的读取和修改的访问级别; 封装就是将抽象得到的数据和行为相结合,形成一个有机的整体,也就是将数据和操作数据的源代码有机结合,…

    数据库 2023年6月6日
    0206
  • Redis小秘密

    Redis小秘密 临渊羡鱼,不如退而织网。 一、Redis基本数据类型 想必很多人都能脱口而出String、List、Hash、Sorted Set和Set五种基本数据类型。 以及…

    数据库 2023年6月14日
    073
  • 【大厂面试必备系列】滑动窗口协议

    引言 想象一下这个场景:主机 A 一直向主机 B 发送数据,不考虑主机 B 的接收能力,则可能导致主机 B 的接收缓冲区满了而无法再接收数据,从而导致大量的数据丢包,引发重传机制。…

    数据库 2023年6月6日
    0115
  • 使用归并排序思想解决逆序对数量问题

    概述 归并排序算法,想必诸位都十分熟悉。其基本思想也就是 分治。整个排序过程分成两部分–分治法将问题 分(divide)成一些小的问题然后递归求解,而 治(conque…

    数据库 2023年6月11日
    099
  • Redis锁相关

    Redis锁相关 君不见,高堂明镜悲白发,朝如青丝暮成雪。 背景:面试的时候被问到有哪些锁,很快脱口而出Volatile、Synchronized和ReentrantLock,也能…

    数据库 2023年6月14日
    079
  • leetcode 83. Remove Duplicates from Sorted List 删除排序链表中的重复元素(简单)

    一、题目大意 给定一个已排序的链表的头 head , 删除所有重复的元素,使每个元素只出现一次 。返回 已排序的链表 。 示例 1: 输入:head = [1,1,2]输出:[1,…

    数据库 2023年6月16日
    098
  • Ansible简介

    Ansible 是一种常用的自动运维化工具,基于 python 开发,分布式,无需客户端,轻量级,配置语言采用 YAML。 模块化:调用特定的模块,完成特殊的任务。 2.Param…

    数据库 2023年6月14日
    0118
  • StoneDB 读、写操作的执行过程

    背景介绍 StoneDB 是一款兼容 MySQL 的开源 HTAP 数据库。StoneDB 的整体架构分为三层,分别是应用层、服务层和存储引擎层。应用层主要负责客户端的连接管理和权…

    数据库 2023年5月24日
    094
  • 员工离职困扰?来看AI如何解决,基于人力资源分析的 ML 模型构建全方案 ⛵

    💡 作者:韩信子@ShowMeAI📘 数据分析实战系列:https://www.showmeai.tech/tutorials/40📘 机器学习实战系列:https://www.s…

    数据库 2023年6月14日
    094
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球