今天做了一个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. [fw]IDT表的初始化

    IDT表的初始化  linux内核的中断描述符表IDT是一个全局的数据,在i386平台上被定义为: struct desc_struct idt_table[256] __attribute__((_ ...

  2. UVA 10256 The Great Divide(凸包划分)

    The Great Divide Input: standard input Output: standard output Time Limit: 8 seconds Memory Limit: 3 ...

  3. JS字符串和数组之间的转换

    1.字符串转换为数组 var string = '123,456,789'; var stringResult = string.split(','); console.log(stringResul ...

  4. Vue小白篇 -Vue 的模板语法

    可以插入任何你想插入的内容,除了 if-else if-else用三元运算符代替 <div id="box"> <!--模板语法--> <h2> ...

  5. 转帖 移动前端开发之viewport的深入理解

    在移动设备上进行网页的重构或开发,首先得搞明白的就是移动设备上的viewport了,只有明白了viewport的概念以及弄清楚了跟viewport有关的meta标签的使用,才能更好地让我们的网页适配或 ...

  6. 最大流的EK算法模板

    模板题:洛谷p3376 题目大意: 给出一个网络图,以及其源点和汇点,求出其网络最大流. 基本思路: 套模板 EK的时间复杂度O(V*E^2) EK算法思路: 1.通过BFS拓展合法节点(每个节点在本 ...

  7. Halo(四)

    BeanWrapper 接口 操作属性 package org.springframework.beans; BeanWrapper bw = new BeanWrapperImpl(beanObje ...

  8. linux基础知识-目录结构

    linux的目录结构/bin:是Binary的缩写,这个目录存放着系统必备执行命令 /boot:这里存放的是启动Linux时使用的一些核心文件,包括一些连接文件以及镜像文 件,自己的安装别放这里 /d ...

  9. AcWing 228. 异或 (dfs+线性基)打卡

    题目:https://www.acwing.com/problem/content/230/ 题意:有一个图,每条边有一个权值,现在求1-n的一条路径的最大异或和,一条边能经过多次,相应的也要计算那么 ...

  10. %各位大佬的博客.tql

    线性基:https://www.cnblogs.com/ljh2000-jump/p/5869991.html#4219854 数位DP  https://blog.csdn.net/jk211766 ...