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 ...
随机推荐
- 50-python基础-python3-列表-函数sorted() 对列表进行临时排序
sorted()函数对列表进行临时排序,返回排序后的列表: 区别列表方法sort()原地修改,无返回值. 1-要保留列表元素原来的排列顺序,同时以特定的顺序呈现它们,可使用函数sorted() . 2 ...
- zoj 3777 Problem Arrangement(壮压+背包)
Problem Arrangement Time Limit: 2 Seconds Memory Limit: 65536 KB The 11th Zhejiang Provincial C ...
- C#实体类get和set的作用
一,实体类属性访问存在两种写法: //第一种写法 private int _id; public int Id { set { _id = value; } get { return _id; } } ...
- 2019-3-1-win10-uwp-使用-LayoutTransformer
title author date CreateTime categories win10 uwp 使用 LayoutTransformer lindexi 2019-03-01 09:24:32 + ...
- go语言从例子开始之Example15.闭包
Go 支持通过 闭包来使用 匿名函数.匿名函数在你想定义一个不需要命名的内联函数时是很实用的. 闭包简单理解,函数反回值是一个函数 Example: package main import " ...
- 在迭代一个集合的时候,如何避免ConcurrentModificationException?
在遍历一个集合的时候,我们可以使用并发集合类来避免ConcurrentModificationException,比如使用CopyOnWriteArrayList,而不是ArrayList.
- 离线安装gcc_rpm(centos下安装gcc的方法之一)
.解压gcc_rpm.tar.gz (我的CSDN账号下载过) tar -zxvf gcc_rpm.tar.gz .解压完进入文件夹,执行以下命令,挨个执行(如果报依赖错误,就加上"--fo ...
- idea maven打jar包
双击clean install 会在根目录targer生成文件(注意删除test和替换yml文件)
- C# 使用猫拨打电话
主窗口一个textbox与btnstart按钮 代码是使用别人!只是去掉部分不用的!只用于拨号!用于辅助打电话! form1 using System; using System.Collection ...
- 前端导出excel表格
前言近期项目有个新需求--将折线图表的数据加一个下载成excel表格的功能.以前下载功能都是调后台接口的,但是这个迭代,后台压力比较重,部分就交给了前端自己实现,下面就记录一下前端如何实现excel表 ...