今天做了一个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性能问题的更多相关文章

  1. MySQL字符集不一致导致性能下降25%,你敢信?

    故事是这样的: 我在对MySQL进行性能测试时,发现CPU使用率接近100%,其中80%us, 16%sys,3%wa,iostat发现磁盘iops2000以下,avgqu-sz不超过3,%util最 ...

  2. MySQL编码不一致导致查询结果为空

    升级数据库后(5.1到8.0),发现一个奇怪的问题,某些页面在升级前可以正常查询,但升级后什么也查不出来了,有时候还会查出错误的结果.经过一整天的排查,终于发现由两个原因导致,现记录如下. 第一是数据 ...

  3. mysql show profiles使用分析sql性能

    mysql show profiles使用分析sql性能 Show profiles是5.0.37之后添加的,要想使用此功能,要确保版本在5.0.37之后. 查看一下我的数据库版本 mysql> ...

  4. MySQL Sending data导致查询很慢的问题详细分析【转载】

    转自http://blog.csdn.net/yunhua_lee/article/details/8573621 [问题现象] 使用sphinx支持倒排索引,但sphinx从mysql查询源数据的时 ...

  5. 实战:MySQL Sending data导致查询很慢的问题详细分析(转)

    这两天帮忙定位一个MySQL查询很慢的问题,定位过程综合各种方法.理论.工具,很有代表性,分享给大家作为新年礼物:) [问题现象] 使用sphinx支持倒排索引,但sphinx从mysql查询源数据的 ...

  6. 实战:MySQL Sending data导致查询很慢的问题详细分析(转)

    出处:http://blog.csdn.net/yunhua_lee/article/details/8573621 这两天帮忙定位一个MySQL查询很慢的问题,定位过程综合各种方法.理论.工具,很有 ...

  7. MySQL Sending data导致查询很慢的问题详细分析

    这两天帮忙定位一个MySQL查询很慢的问题,定位过程综合各种方法.理论.工具,很有代表性,分享给大家作为新年礼物:) [问题现象] 使用sphinx支持倒排索引,但sphinx从mysql查询源数据的 ...

  8. 0223实战:MySQL Sending data导致查询很慢的问题详细分析

    转自博客http://blog.csdn.net/yunhua_lee/article/details/8573621 [问题现象] 使用sphinx支持倒排索引,但sphinx从mysql查询源数据 ...

  9. 在MySQL中使用explain查询SQL的执行计划

    1.什么是MySQL执行计划 要对执行计划有个比较好的理解,需要先对MySQL的基础结构及查询基本原理有简单的了解. MySQL本身的功能架构分为三个部分,分别是 应用层.逻辑层.物理层,不只是MyS ...

随机推荐

  1. SCAU大二上Java综合性实验

    一.题目要求 实验内容: 1. 已经提供的原始数据:班级成绩单文件 该文件为文本文件,存储某个班的所有学生某门课程的成绩. 例如:2012级计算机科学与技术8班-面向对象程序设计.txt 文件中每行存 ...

  2. rope(平衡二叉树)

    题目描述: 链接:https://www.nowcoder.com/acm/contest/141/C来源:牛客网 Eddy likes to play cards game since there ...

  3. SpringBoot-技术专区-实战方案-应用监控线程池

    背景 废话不多说,做这个监控的背景很简单,我们的项目都是以spring boot框架为基础开发的,代码里所有的异步线程都是通过@Async标签标注的,并且标注的时候都是指定对应线程池的,如果不知@As ...

  4. WPF-将DataGrid控件中的数据导出到Excel

    原文:WPF-将DataGrid控件中的数据导出到Excel 导出至Excel是非常常见,我们可以用很多类库,例如Aspose.NOPI.Interop,在这里我们使用微软自家的工具.我的WPF绑定的 ...

  5. String类可以被继承吗?我们来聊聊final关键字!

    String类可以被继承吗?我们来聊聊final关键字! String在java基础知识中绝对是个重点知识,关于String的一些问题也是非常的多,而且牵涉到内存等高级知识,在面试中也是经常被考察的一 ...

  6. PHP应该学什么,如何学好PHP

    http://blog.sina.com.cn/s/blog_76bdabf70101azl4.html(注:原文来自传智播客) 本文转自http://blog.sina.com.cn/s/blog_ ...

  7. 2018-12-25-win2d-图片水印

    title author date CreateTime categories win2d 图片水印 lindexi 2018-12-25 10:37:52 +0800 2018-03-19 08:3 ...

  8. linux c 链接详解5-虚拟内存管理

    5. 虚拟内存管理 我们知道操作系统利用体系结构提供的VA到PA的转换机制实现虚拟内存管理.有了共享库的基础知识之后,现在我们可以进一步理解虚拟内存管理了.首先分析一个例子: $ ps PID TTY ...

  9. 2019牛客多校第五场F maximum clique 1 最大独立集

    题意:给你n个数,现在让你选择一个数目最大的集合,使得集合中任意两个数的二进制表示至少有两位不同,问这个集合最大是多大?并且输出具体方案.保证n个数互不相同. 思路:容易发现,如果两个数不能同时在集合 ...

  10. Codeforces 1188B 式子转化

    思路:看到(a + b)想到乘上(a - b)变成平方差展开(并没有想到2333), 两边同时乘上a - b, 最后式子转化成了a ^ 4 - ka = b ^ 4 - kb,剩下的就水到渠成了. 0 ...