首页 > 数据库 >MySQL 数据库表字段字符集编码不一致导致隐式转换索引失效案例分析

MySQL 数据库表字段字符集编码不一致导致隐式转换索引失效案例分析

时间:2023-06-15 16:25:52浏览次数:53  
标签:编码 code MySQL 字符集 索引 sql 隐式

    有网友咨询,丢过来一段sql 语句,说是执行一次耗时10多分钟,让帮忙看看。表数据量在5万左右,数据量不大,首先确认表统计信息都是准确的,查询sql以及执行计划如下:

2f6ecc72341060cafcb4a0b821dae95

    可以看到嵌套循环join 部分全表扫描,缺失索引,应该在join 条件列hoist_code、device_code 建立索引,但是网友反馈这2个条件列都已经存在索引,网友提供表结构建表sql 语句如下:

03abe5e97350e51c1da93397c741f6a

  不难看出,确实存在索引,但是仔细一看,2个字段字符集编码居然不一致,虽然2个表在表级定义的字符集编码都是UTF8MB4,但是hoist_code 却在列级定义了utf8 字符集编码,显然2个字符集编码不一致,发生了隐式转换,导致索引失效。解决方法也很简单:移除2表所有在列级定义的字符集编码,只在表级定义字符集编码为UTF8MB4。调整后sql 执行时间秒级,问题解决,sql 执行计划如下:

      2f9e02719738cffd51072da34c5c189

标签:编码,code,MySQL,字符集,索引,sql,隐式
From: https://www.cnblogs.com/oradba/p/17483224.html

相关文章

  • CentOs7安装部署Sonar环境(JDK1.8+MySql5.7+sonarqube7.8)
    sonarqube安装前环境准备JDK1.8、MySql5.7。一、JDK安装1、下载jdk #打开下面的网址,选择jdk-8u371-linux-x64.tar.gz进行下载(8u371版本可能会有区别,但是没有影响) http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html2、......
  • mysql 报错 :The table xxx is full
    ############################################现象:用户执行的sql语句报错:Cause:java.sql.SQLException:Thetable'/home/work/mysql_3306//tmp/#sql117f0c_db7113_a4'isfull 原因:参数internal_tmp_mem_storage_engine是默认值TempTable,当临时表大小超过temptable_m......
  • mysql面试常见问题
    mysql面试常见问题以下是MySQL面试中常见的问题:什么是索引?MySQL中有哪些类型的索引?InnoDB和MyISAM存储引擎的区别是什么?MySQL的锁机制有哪些?如何避免死锁?什么是事务?MySQL中如何回滚一个事务?如何进行SQL性能优化?你了解的常用优化技巧有哪些?请简述MyS......
  • docker 安装 mysql5
    version:'3'services:mysql57:#容器名(以后的控制都通过这个)container_name:mysql57#重启策略restart:alwaysimage:mysql:5.7ports:-"3307:3306"volumes:#挂载配置文件#-./mysql/db/:/docker-en......
  • Windows Server 2022 安装配置 MYSQL 及远程连接
    官方下载地址:https://dev.mysql.com/downloads/mysql/解压后新建my.ini放在解压目录下。配置环境变量:此电脑->属性->高级系统设置->环境变量->系统变量。找到path,新建D:\ProgramFiles\mysql-8.0.33-winx64\bin[mysqld]#设置3306端口port=3306#设置mysql的安装目录based......
  • 解决mysql数据库 ‘ MySQL server has gone away’
    参考:https://www.jianshu.com/p/8c8086c11cae原因:查询的结果集超过max_allowed_packet查看执行SQL执行文件大小是否超过max_allowed_packet,如果超过则需要调整参数,或者优化语句。解决:修改参数,max_allowed_packet,比如调整为28M。要大于执行的SQL文件大小setglobalmax_a......
  • MySQL如何初始化常量Item?
    MySQL中的一切表达式都是继承自Item类,常量也不外乎如此。以Item_float为例子说明MySQL如何初始化常量Item。首先在Parser里面:NUM_literal:NUM{interror;$$=new(YYTHD->mem_root)Item_int($1,......
  • 详解MySQL Server端如何发送结果集给客户端
    MySQLServer和Client之间的交互有一套定义得很明确的协议,称为MySQLClient/ServerProtocol。写数据库的人,只需要遵循这套协议来写程序,就能让自己的数据库被各种MySQL客户端连接,如mysql命令行,phpmysql,JDBC等等。这是一个非常诱人的设计选择(DesignChoice)!如果自己实现一套协议,写......
  • CentOs7安装部署Sonar环境(JDK1.8+MySql5.7+sonarqube7.8)
    sonarqube安装前环境准备JDK1.8、MySql5.7。一、JDK安装1、下载jdk#打开下面的网址,选择jdk-8u371-linux-x64.tar.gz进行下载(8u371版本可能会有区别,但是没有影响)http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html2、安装jdk#创建......
  • 云小课|RDS for MySQL参数模板一键导入导出,参数配置轻松搞定
    摘要:云数据库RDSforMySQL支持参数模板的导入和导出功能。本文分享自华为云社区《【云小课】【第56课】RDSforMySQL参数模板一键导入导出,参数配置轻松搞定》,作者:数据库的小云妹。云数据库RDSforMySQL支持参数模板的导入和导出功能。导入参数模板:导入后会生成一个新的参数模板,......