mysql or走索引吗_面试官:mysql字符集编码不一致会导致索引失效吗?

本文探讨了一例SQL查询在开发和综测环境中性能相差巨大的问题。通过对比执行计划、检查索引、分析表存储引擎和字符集,发现是字符集不同导致的索引失效。经过修改字符集并调整后,SQL执行效率显著提升,从140多秒降低到1秒内。这是一次关于数据库性能优化的实际案例。
摘要由CSDN通过智能技术生成

概述

今天开发反馈同样的sql且数据量一致,但在综测环境需要140多秒,而在开发环境只需要1秒多,这是什么原因呢?下面一起来看看吧~


问题sql

SELECT ty.IS_FIXATION AS isFixation,CASE WHEN ty.INSPECTION_RULES IS NOT NULL  AND ty.IS_INSPECTION = 'Y' THEN '未打卡' ELSE NULL  END AS inspectionStatus,FROM t_ams_asset_card t LEFT JOIN T_AMS_ASSET_TYPE ty ON ty.TYPE_NO = t.ASSET_TYPE AND t.FINANCE_CODE = ty.ORG_CODELEFT JOIN hr_employee e ON t.USE_MAN = e.EMPLOYEE_CODEWHERE t.ASSET_MODULE = 'OWN'  AND t.IS_DELETE = 'N'

对比:

798924391f239cbd39517e782ddbfcd9.png
9c9b736c01bb5655411498b96e23cc61.png

思路:这种情况一般是没有索引或者索引失效导致。


1、对比执行计划

这里通过explain + sql查看执行计划

463ece3cf3d231ba01ab8806217478c8.png
5367aee4dc54748c2a2dab09a0c5a9fd.png

2、检查两边环境索引情况

可以发现两边环境都有索引,那应该就是某个索引失效了..

97687da481e7c97706a6c17bfe085d4e.png

3、强制使用索引

这里试一下 force index(HR_EMPLOYEE_U1) ,发现强制使用索引也是失效的,在这里索引为什么会失效呢?

692a14747cb4702458794bb3ecb4c0d1.png

4、检查表存储引擎、表字段数据类型、表字段字符集

一般索引失效都是表的存储引擎、字段数据类型或者字符集不同导致走的隐性转换

show full columns from hr_employee;show full columns from t_ams_asset_card;
54c48b16f9e2a3286d6cd43ad539d123.png
dff1ae36dc33b08eb4575de81249d080.png
d43f2f0bd1070f89730b4d159ad88006.png

5、修改字符集编码后测试

SELECTc.TABLE_SCHEMA '数据库',c.TABLE_NAME '表',c.COLUMN_NAME '字段',c.COLUMN_DEFAULT '默认值',c.IS_NULLABLE '是否为空',c.DATA_TYPE '字段类型',c.character_set_name '原字符集',c.collation_name '原排序规则',CONCAT('ALTER TABLE ',TABLE_SCHEMA,'.',TABLE_NAME,' MODIFY COLUMN ',COLUMN_NAME,' ',COLUMN_TYPE,' CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci ',CASEWHEN c.is_nullable = 'NO' THEN'NOT NULL' ELSE 'NULL' END,CASEWHEN c.COLUMN_DEFAULT = '' THEN' DEFAULT ''''' WHEN c.COLUMN_DEFAULT IS NULL THEN' DEFAULT NULL' ELSE concat( ' DEFAULT ', '''', c.COLUMN_DEFAULT, '''' ) END,' comment ','''',c.COLUMN_COMMENT,'''',';' ) '修正SQL' FROMinformation_schema.`COLUMNS` c WHEREtable_name = 'hr_employee' and table_schema='lcp_db'AND CHARACTER_SET_NAME = 'utf8';
b38614381c58380c96d5e2f6d1f180b5.png

6、再次查看执行计划

调整后发现已使用索引,且sql执行也在1秒内,满足需求。

0927f88f6a9c028d71c8d0b663e89ea9.png

觉得有用的朋友多帮忙转发哦!后面会分享更多devops和DBA方面的内容,感兴趣的朋友可以关注下~

e773d84fbd4e72539590f22238ebc80a.gif
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值