MySQL45讲之函数转换导致不使用索引 – flowers「终于解决」

MySQL45讲之函数转换导致不使用索引 – flowers「终于解决」本文介绍三种因为函数转换导致不使用索引的问题。

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

前言

本文介绍三种因为函数转换导致不使用索引的问题。注意,不使用索引指的是不使用树搜索,而是全表扫描索引树。

显式使用函数

比如 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 就可以,这里感觉优化器偷懒了。

参考

  • [1] 为什么这些SQL语句逻辑相同,性能却差异巨大

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
转载请注明出处: https://daima100.com/5839.html

(0)
上一篇 2023-04-22
下一篇 2023-04-22

相关推荐

  • 使用os.chmod更改文件权限

    使用os.chmod更改文件权限对于任何操作系统来说,控制文件和目录权限是一项非常重要的任务。为了保护文件或目录,操作系统需要确保它们只能被授权用户访问。这是操作系统的基本安全措施。Python的os库提供了os.chmod()函数来实现更改文件和目录权限的功能。在本文中,我们将深入探讨该函数的用法。

    2024-06-08
    54
  • JavaScript如何遍历对象属性

    JavaScript如何遍历对象属性在JavaScript中,对象是一种复杂的数据类型,可以用来表示复杂的数据结构和对象之间的关系。对象由属性键值和方法组成,其中属性键值是指对象的属性名称和对应的值。当我们需要遍历对象属性时,就需要使用JavaScript提供的各种方法来实现。本文将从多个方面对如何使用JavaScript遍历对象属性做详细的阐述。

    2024-07-13
    50
  • 成都哪里可以开运输费发票-中国-新闻网「建议收藏」

    成都哪里可以开运输费发票-中国-新闻网「建议收藏」成都哪里可以开运输费发票【152 * 9б 28 * 21 б9】陈生,诚、信、合、作,保、真、售、后、保、障、长、期、有、效。adb的全称为Android Debug Bridge,是Androi…

    2023-02-01
    147
  • Windows 下安装 MariaDB (mariadb-10.4.13-winx64.zip) 数据库[亲测有效]

    Windows 下安装 MariaDB (mariadb-10.4.13-winx64.zip) 数据库[亲测有效]1. 官网下载 mariadb-10.4.13-winx64.zip , 并解压 2. 在对应的bin目录下, 执行cmd命令, 以管理员身份运行cmd, 然后执行 mysql_install_db…

    2023-03-07
    297
  • Deepin 下安装 LAMP

    Deepin 下安装 LAMPubuntu/deepin linux 下使用 apt-get 安装所需套的软件 LAMP 1. 安装 apacache2 apt-get install apache2 配置文件:/etc/apa…

    2023-02-06
    143
  • 优化Linux环境变量,加速Python程序

    优化Linux环境变量,加速Python程序Linux作为一种高效的操作系统,可以提供快速的运行环境。但是,随着用户数量和数据量的增加,大量的环境变量会降低系统性能,并使进程的启动速度变慢。可以通过以下方法来优化环境变量:

    2024-01-02
    104
  • 配置Anaconda环境变量

    配置Anaconda环境变量在Python领域,Anaconda是一个常用的集成开发环境和工具包管理器。安装Anaconda时,用户需要配置环境变量,以便可以在命令行中调用Anaconda环境。本文将详细介绍如何配置Anaconda环境变量。

    2024-09-09
    34
  • mysql配置优化「建议收藏」

    mysql配置优化「建议收藏」将这个参数设为0或大于1以上的数值会提高数据库的性能,但同时会伴随数据丢失的风险。二进制日志文件涉及到数据的恢复,以及想在主从之间获得最大的一致性,那么应该将该参数设置为1,但同时也会造成一定的性能损

    2023-04-15
    151

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注