概述
今天开发反馈同样的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'
对比:
思路:这种情况一般是没有索引或者索引失效导致。
1、对比执行计划
这里通过explain + sql查看执行计划
2、检查两边环境索引情况
可以发现两边环境都有索引,那应该就是某个索引失效了..
3、强制使用索引
这里试一下 force index(HR_EMPLOYEE_U1) ,发现强制使用索引也是失效的,在这里索引为什么会失效呢?
4、检查表存储引擎、表字段数据类型、表字段字符集
一般索引失效都是表的存储引擎、字段数据类型或者字符集不同导致走的隐性转换
show full columns from hr_employee;show full columns from t_ams_asset_card;
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';
6、再次查看执行计划
调整后发现已使用索引,且sql执行也在1秒内,满足需求。
觉得有用的朋友多帮忙转发哦!后面会分享更多devops和DBA方面的内容,感兴趣的朋友可以关注下~
文章来源: https://twgreatdaily.com/zh-hans/dyX2sG8B8wMrh2Li-0kD.html