MySQL字符集不一致导致查询SQL性能问题
今天做了一个MySQL数据库中的SQL优化。
结论是关联字段字符集不同,导致索引不可用。
查询的SQL如下:
select
`Alias`.`Grade`,
`Alias`.`id`,
`Alias`.`Cust_Name`,
`Alias`.`Agent_Code1`
from `database_name1`.`TAB1` as `Alias`
where (
`Alias`.`Agent_Code1` = '1090300496329'
and `Alias`.`id` in (
select `database_name1`.`TAB2`.`B`
from `database_name1`.`TAB2`
join `database_name1`.`TAB3` as `T1`
on `T1`.`id` = `database_name1`.`TAB2`.`A`
where (
`T1`.`Cust_Type` in (
'1200001', '1200002'
)
and `T1`.`id` in (
select `database_name1`.`TAB4`.`B`
from `database_name1`.`TAB4`
join `database_name1`.`TAB5` as `T2`
on `T2`.`id` = `database_name1`.`TAB4`.`A`
where `T2`.`Cont_Meth_Tp_Cd` = '1220001'
)
)
)
)
order by
`Alias`.`Cust_Name` asc,
`Alias`.`id` asc
limit 11
offset 0
SQL的执行计划如下 :
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: Alias
partitions: NULL
type: ref
possible_keys: PRIMARY
key_len: 203
ref: const
rows: 894
filtered: 100.00
Extra: Using index condition
*************************** 2. row ***************************
id: 1
select_type: SIMPLE
table: TAB2
partitions: NULL
type: ref
possible_keys: TAB2_IDX
key: TAB2_IDX
key_len: 103
ref: database_name1.Alias.id
rows: 1
filtered: 100.00
Extra: Using where; Using index
*************************** 3. row ***************************
id: 1
select_type: SIMPLE
table: HDL_ADD_CUSTOMER_Alias
partitions: NULL
type: eq_ref
possible_keys: PRIMARY
key: PRIMARY
key_len: 77
ref: func
rows: 1
filtered: 55.42
Extra: Using where
*************************** 4. row ***************************
id: 1
select_type: SIMPLE
table: TAB4
partitions: NULL
type: index
possible_keys: NULL
key: TAB4_IDX
key_len: 206
ref: NULL
rows: 5852807
filtered: 100.00
Extra: Using where; Using index
*************************** 5. row ***************************
id: 1
select_type: SIMPLE
table: T2
partitions: NULL
type: eq_ref
possible_keys: PRIMARY
key: PRIMARY
key_len: 142
ref: database_name1.TAB5.A
rows: 1
filtered: 50.00
Extra: Using where; FirstMatch(Alias)
5 rows in set, 1 warning (0.01 sec)
由于对MySQL执行计划不熟,看了半天也没看出有啥问题。
但是第4行有一个地方引起我的注意了,possible_keys = NULL ,key = TAB4_IDX
字面理解:可能走的索引没有,实际上走了索引。
实际上是没有走索引范围扫描。后来从MySQL Wordbench 的执行计划里找到了端倪。
在TAB4表上的关联字段ID发生了隐式转换,这个字段的字符集是 gbk的, 而t2.id 字符集是utf8 的;
结果导致转换后,tab4上的索引没法使用。发生了 block nested loops;
从索引中读所有数据到内存。 index full scan ;
确认这段时间可以更新,把ID字段字符集都改成一致即可。
ALTER TABLE `database_name1`.`tab3`
CHANGE COLUMN `id` `id` VARCHAR(25) CHARACTER SET 'gb18030' NOT NULL ;
MySQL字符集不一致导致查询SQL性能问题的更多相关文章
- MySQL字符集不一致导致性能下降25%,你敢信?
故事是这样的: 我在对MySQL进行性能测试时,发现CPU使用率接近100%,其中80%us, 16%sys,3%wa,iostat发现磁盘iops2000以下,avgqu-sz不超过3,%util最 ...
- MySQL编码不一致导致查询结果为空
升级数据库后(5.1到8.0),发现一个奇怪的问题,某些页面在升级前可以正常查询,但升级后什么也查不出来了,有时候还会查出错误的结果.经过一整天的排查,终于发现由两个原因导致,现记录如下. 第一是数据 ...
- mysql show profiles使用分析sql性能
mysql show profiles使用分析sql性能 Show profiles是5.0.37之后添加的,要想使用此功能,要确保版本在5.0.37之后. 查看一下我的数据库版本 mysql> ...
- MySQL Sending data导致查询很慢的问题详细分析【转载】
转自http://blog.csdn.net/yunhua_lee/article/details/8573621 [问题现象] 使用sphinx支持倒排索引,但sphinx从mysql查询源数据的时 ...
- 实战:MySQL Sending data导致查询很慢的问题详细分析(转)
这两天帮忙定位一个MySQL查询很慢的问题,定位过程综合各种方法.理论.工具,很有代表性,分享给大家作为新年礼物:) [问题现象] 使用sphinx支持倒排索引,但sphinx从mysql查询源数据的 ...
- 实战:MySQL Sending data导致查询很慢的问题详细分析(转)
出处:http://blog.csdn.net/yunhua_lee/article/details/8573621 这两天帮忙定位一个MySQL查询很慢的问题,定位过程综合各种方法.理论.工具,很有 ...
- MySQL Sending data导致查询很慢的问题详细分析
这两天帮忙定位一个MySQL查询很慢的问题,定位过程综合各种方法.理论.工具,很有代表性,分享给大家作为新年礼物:) [问题现象] 使用sphinx支持倒排索引,但sphinx从mysql查询源数据的 ...
- 0223实战:MySQL Sending data导致查询很慢的问题详细分析
转自博客http://blog.csdn.net/yunhua_lee/article/details/8573621 [问题现象] 使用sphinx支持倒排索引,但sphinx从mysql查询源数据 ...
- 在MySQL中使用explain查询SQL的执行计划
1.什么是MySQL执行计划 要对执行计划有个比较好的理解,需要先对MySQL的基础结构及查询基本原理有简单的了解. MySQL本身的功能架构分为三个部分,分别是 应用层.逻辑层.物理层,不只是MyS ...
随机推荐
- wireshark 识别http的标准
使用route add 本机ip 255.255.255.255 网关ip metric 1 的方式 会使访问本机ip的连接发送到局域网内,这样wireshark就可以抓取到 但有一点需要注意 如果本 ...
- Uncaught PDOException: SQLSTATE[HY000] [2002] No such file or directory
执行下面的代码报错: $pdo = new PDO('mysql:dbname=db_test;host=localhost', 'root', '123456'); PHP Fatal error: ...
- Java script-1
什么是JavaScript? JavaScript是一种直译式脚本语言,一种轻量级的脚本语言. 什么是脚本语言? Script language指的是它不具备开发操作系统的能力,而是只用来编写控制其他 ...
- kvm的img文件的本机挂载
非lvm分区挂载方法: mount -o loop xxx.img /mnt/xxx 系统提示: “mount: you must specify the filesystem type” 执行:fd ...
- oracle11g rename user导致物化视图失效的处理
在上一篇文章中,已经点到了数据库改名时,引起该schema下物化视图会失效的问题.从表面上看,该物化视图是删也删不掉,那当然就无法重建了.以下是实验过程: Oracle Database 11g En ...
- Qt 显示网页的控件
Qt5.6以下的版本,基于QtWebkit控件Qt5.6以上的MSVC版本,基于 Chromium 的浏览器引擎 Qt WebEngineQt5.6以上的mingw 版本,只能采用QAxWidget ...
- 洛谷P2786 英语1(eng1)- 英语作文
题目背景 蒟蒻HansBug在英语考场上,挠了无数次的头,可脑子里还是一片空白. 题目描述 眼下出现在HansBug蒟蒻面前的是一篇英语作文,然而智商捉急的HansBug已经草草写完了,此时 他发现离 ...
- Python深度学习
序言 目的驱动型学习 概念解释 资料 https://www.tensorflow.org/ https://www.imooc.com/video/17186 https://www.cnblogs ...
- Kubernetes 健康检查的两种机制:Liveness 探测和 Readiness 探测
Kubernetes 健康检查的两种机制:Liveness 探测和 Readiness 探测,并实践了健康检查在 Scale Up 和 Rolling Update 场景中的应用.kubelet使用启 ...
- ThinkPHP示例:图片上传
ThinkPHP示例之图片上传,包括图片上传.数据库保存.缩略图生成以及图片水印功能演示.首先需要下载框架核心,然后把示例解压到Web根目录下面,并修改入口文件中的框架入口文件的位置.导入示例目录下面 ...