记一次mysql字符集编码问题导致查询时间过长问题

news/2024/12/17 19:59:04/

数据表 rm_ic.audit_summary_2024_05_20 该表大概有1200w数据,有个字段为ids 不是唯一的,已建索引 audit_ids_idx

create table rm_ic.test1

(

id varchar(19) primary key not null comment 'id',

create_time datetime default CURRENT_TIMESTAMP

);

create table rm_ic.test2

(

id varchar(19) charset utf8 primary key not null comment 'id',

create_time datetime default CURRENT_TIMESTAMP

);

-- 插入十万条 ids数据

insert into rm_ic.test1 select ids,sysdate() from (select distinct ids from rm_ic.audit_summary_2024_05_20 limit 100000)t ;

insert into rm_ic.test2 select ids,sysdate() from (select distinct ids from rm_ic.audit_summary_2024_05_20 limit 100000)t ;

关键来了,因为ids可能重复,我们test表id不重复,简单的count()下 

select count(1) from rm_ic.audit_summary_2024_05_20 inner join rm_ic.test1 w on ids=w.id where 1=1;

select count(1) from rm_ic.audit_summary_2024_05_20 inner join rm_ic.test2 w on ids=w.id where 1=1;

 看到真相的我眼泪都要掉下来,怎么一个test2=0.5s,test1=13s呢?结果数据count都是一样的呀,

test1和test2的id字段都是主键啊?难道没走索引,难道有其他问题?explain来解释下把

可以看到test1的innerjoin

test1表是eq_ref,summary=index

test2表是index,summary=ref

众所周知eq_ref>ref>index

上面说了sumamry表数据为1200w,test表都只有10w 那么肯定是summary表查询走ref>index的查询速度的。

那么为什么造成这样的区别呢?test1和test2表有什么区别呢?建表的时候id指定了字符集?

MySQL查看和修改数据库字符集的方法_修改数据库字符集sql-CSDN博客

1.查看MYSQL数据库服务器和数据库字符集

  方法一:show variables like '%character%';
  方法二:show variables like 'collation%';
2.查看库的字符集

show create database rm_ic;

查看表的字符集

show table status from 库名 like 表名;

查看表中所有列的字符集

show full columns from 表名;

可以看到数据库默认的编码 utf8mb4_bin

audit_summary表的ids字段 utf8_general_ci

test1的id字段是 utf8mb4_bin

test2的id字段是 utf8_general_ci

因为test1的id字段是和summary字段的ids字段编码集不一样,所以导致索引失效,懒得研究了直接百度 mysql编码集不一样导致索引失效

MySQL表字段字符集不同导致的索引失效问题_表字符集不一致导致索引失效-CSDN博客

test2为什么查询比较快?因为test2数据量为10w小表,默认是驱动表,也就是先通过index查test2,然后驱动大表test1为什么查询比较慢呢?因为先全表扫描1000w的大表audit_summary,然后再根据关联条件查询test1.

字符集转换遵循由小到大的原则,因为utf8mb4是utf8的超集,所以这里把utf8转换成utf8mb4,也就是先查询utf8的summary表然后将其转化。

-------最后说下------

为什么会造成这个原因呢?一般来说我们都是默认字符集的,那么所有的字符集应该一样啊。

原因是我们之前的版本字符集是utf8,后来发现不能存emoj 😀 就是这种字符,后面就把数据的字符集改了改为 utf8mb4,然后新表和旧表的字符集就对不上了。。


http://www.ppmy.cn/news/1555941.html

相关文章

ReactPress最佳实践—搭建导航网站实战

Github项目地址:https://github.com/fecommunity/easy-blog 欢迎Star。 近期,阮一峰在科技爱好者周刊第 325 期中推荐了一款开源工具——ReactPress,ReactPress一个基于 Next.js 的博客和 CMS 系统,可查看 demo站点。(…

Scala泛型应用场景

Scala中的泛型(Generics)是一种强大的工具,允许开发者编写可重用的代码,同时保持类型安全。泛型在Scala中有多种应用场景,以下是一些常见的应用场景: 集合类: Scala的集合类(如List…

UE4_控件蓝图_制作3D生命血条

一:效果图如下: 二、实现步骤: 1、新建敌人 右键蓝图类 选择角色, 重命名为BP_Enemytest。 双击打开,配置敌人网格体 修改位置及朝向 效果如下: 选择合适的动画蓝图类: 人物就有了动作&#x…

深入了解IPv6——光猫相关设定:DNS来源、DHCPv6服务、前缀来源等

光猫IPv6设置后的效果对比图: 修改前: 修改后: 一、DNS来源 1. 网络连接 来源: 从上游网络(如运营商)获取 IPv6 DNS 信息,通过 PPPoE 或 DHCPv6 下发。 特点: DNS 服务器地址直…

Linux中vim常用命令详解

文章目录 Linux中vim常用命令详解一、引言二、Vim的工作模式1、命令模式1.1、常用命令 2、输入模式3、底线命令模式 三、文本编辑1、移动命令2、编辑操作3、撤销与重做 四、使用示例1、查找与替换2、多文件编辑 五、总结 Linux中vim常用命令详解 一、引言 Vim 是 Linux 系统中…

[openGauss 学废系列]- openGauss学习笔记整理 - 熟练掌握gsql工具的使用

一、学习目标 这节课是本次实训第二节课程,本次课的重点是熟练掌握gsql工具的使用。熟悉Oracle的人可能都很熟悉sqlplus工具,gsql类似于Oracle的sqlplus,gsql是openGauss数据库提供的在命令行下连接数据库的工具,可通过gsql工具连…

【AIStarter】告别复杂转换 - MinerU整合包实现PDF到Markdown的无缝转变

在数字化时代,信息的传递与共享变得愈发重要。文档格式之间的转换成为了日常工作中不可或缺的一部分。为了满足用户对高效工作流程的需求,新版MinerU整合包应运而生,它不仅简化了从PDF到Markdown的转换过程,还为用户带来了前所未有…

【Linux网络】网络基础:传输层UDP/TCP协议(一)

📝个人主页🌹:Eternity._ ⏩收录专栏⏪:Linux “ 登神长阶 ” 🌹🌹期待您的关注 🌹🌹 ❀ 传输层UDP/TCP协议 📒端口号📜UDP协议UDP协议端格式UDP的特点UDP的缓…