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)

大家都在看

  • LinkedList源码刨析

    404. 抱歉,您访问的资源不存在。 可能是网址有误,或者对应的内容被删除,或者处于私有状态。 代码改变世界,联系邮箱 contact@cnblogs.com 园子的商业化努力-困…

    数据库 2023年6月16日
    084
  • Java 多线程共享模型之管程(下)

    共享模型之管程 wait、notify wait、notify 原理 Owner 线程发现条件不满足,调用 wait 方法,即可进入 WaitSet 变为 WAITING 状态 B…

    数据库 2023年6月16日
    0116
  • JSP基础知识总结

    JSP概述 什么是 jsp Servlet 程序输出 html 页面 如何创建一个 jsp 动态页面程序 如何修改 jsp 文件的默认编码 jsp 的运行原理 jsp 的语法 js…

    数据库 2023年6月11日
    0104
  • MySQL慢查询优化问题-解决办法

    根据发现的问题,找出原因,然后对症下药。 [En] According to the problems found, find the cause, and then prescr…

    数据库 2023年5月24日
    097
  • Docker安装Mysql

    1、在docker hub 上查看要下载的mysql镜像名称 dockerHub官网地址 在上方搜索栏里输入mysql 找到要拉取的镜像版本,在tag下找到版本 回到虚拟机界面,执…

    数据库 2023年6月16日
    094
  • 机器学习模型太慢?来看看英特尔(R) 扩展加速 ⛵

    💡 作者:韩信子@ShowMeAI📘 机器学习实战系列:https://www.showmeai.tech/tutorials/41📘 本文地址:https://www.showm…

    数据库 2023年6月14日
    086
  • MySQL提示sql_mode=only_full_group_by解决办法

    MySQL异常sql_mode=only_full_group_by 原因:在MySQL 5.7后MySQL默认开启了SQL_MODE严格模式,对数据进行严格校验。会报sql_mo…

    数据库 2023年6月14日
    092
  • 事务

    事务 *事务的简介 事务是一组操作的集合,这是一个不可分割的工作单元。事务将向整个系统提交或取消操作请求。这些操作只能同时成功和失败。 [En] A transaction is …

    数据库 2023年5月24日
    0114
  • MySQL45讲之生产环境下的性能问题

    本文介绍了一些常见的性能问题以及如何在生产环境中解决这些问题。 [En] This article introduces some common performance probl…

    数据库 2023年5月24日
    0111
  • 为了防止这个公众号被封,我连夜用Python爬取了它所有图片~

    哈喽兄弟们,今天来试试批量获取公众号文章,emmm… 虽然名义上是文章,单其实它是一篇纯图片文,至于为什么不是文字,小姐姐不比文字香? ; 事前准备 我们需要用到 Fi…

    数据库 2023年6月14日
    098
  • 有道云笔记迁移到为知笔记

    背景 &#x4E4B;&#x524D;&#x4E00;&#x76F4;&#x7528;&#x7684;&#x6709;&am…

    数据库 2023年6月9日
    093
  • cv2简单使用(opencv-python)

    404. 抱歉,您访问的资源不存在。 可能是网址有误,或者对应的内容被删除,或者处于私有状态。 代码改变世界,联系邮箱 contact@cnblogs.com 园子的商业化努力-困…

    数据库 2023年6月9日
    070
  • Css3入门详解

    一、Css基本语法 1.Html和Css没分开 点击查看代码 <!DOCTYPE html> <html lang="en"> <…

    数据库 2023年6月16日
    089
  • 8、ThreadPoolTaskExecutor线程并发

    一、线程池的优点: 1、降低资源消耗。通过重复利用自己创建的线程降低线程创建和销毁造成的消耗。 2、提高响应速度。当任务到达时,任务可以不需要等到线程创建就能立即执行。 3、提高线…

    数据库 2023年6月6日
    094
  • MySQL 用 limit 为什么会影响性能?

    1.前言 首先说明一下MySQL的版本: mysql> select version(); +———–+ | version() | +———–+…

    数据库 2023年5月24日
    076
  • 微服务架构设计模式

    内容简介 成功地开发基于微服务架构的应用软件,需要掌握一系列全新的架构思想和实践。在这本书籍中解释了 44 个架构设计模式,这些模式用来解决诸如服务拆分、事务管理、查询和跨服务通信…

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