mysql优化方案最新(记一次MySQL的优化案例)
mysql优化方案最新
记一次MySQL的优化案例一 背景
有赞的每个OLTP数据库实例上会设置一个sql-killer进程用于kill 掉执行时间超过一定阈值的sql。下午开发接收到sql被kill的报错,一起帮助开发排查,本文介绍该案例。
二 场景分析
表结构:
|
CREATE TABLE `xxx_info` ( `id` bigint (20) unsigned NOT NULL AUTO_INCREMENT COMMENT 'id' , `user_id` bigint (20) unsigned NOT NULL DEFAULT '0' , `group_id` bigint (20) unsigned NOT NULL DEFAULT '0' , `nick_name` varchar (30) NOT NULL DEFAULT '' COMMENT '昵称' , `is_del` tinyint(5) NOT NULL DEFAULT '0' COMMENT '0:数据有效、1:数据逻辑删除' , `created_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间' , `updated_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改时间' , PRIMARY KEY (`id`), KEY `idx_userid_groupid` (`user_id`,`group_id`) ) ENGINE=InnoDB AUTO_INCREMENT=1382032 DEFAULT CHARSET=utf8mb4 ; |
问题sql如下
|
SELECT id, name ,status FROM xxx_info WHERE user_id IN (670039223, '373149878' ) AND group_id = 1 AND is_del = 0; |
第一眼看到sql ,先检查了表结构 和索引 user_id 是数值类型的,且索引ok 然后手工执行计划竟然没有走idx_userid_groupid索引,
怀疑 user_id in 两种不同类型的字段导致"隐式转换",将 其中参数值都换为数值类型或者字符串 或者使用 user_id=数值类型 or user_id=字符串,再次执行
执行计划都是正确。对此我们要解决两个问题
那么为啥当user_id in (X,Y,Z) 是不同类型时,就不走索引了呢?
我们使用optimizer_trace 来跟踪执行计划。
|
set session optimizer_trace= 'enabled=on' ; SELECT id, nick_name,is_del FROM xxx_info WHERE user_id IN (670039223, '373149878' ) AND group_id = 1 AND is_del = 0; select * from information_schema.optimizer_trace; SELECT id, nick_name,is_del FROM xxx_info WHERE user_id IN (670039223, '373149878' ) AND group_id = 1 AND is_del = 0; select * from information_schema.optimizer_trace; set session optimizer_trace= 'enabled=off' ; |
获取两个sql的执行计划并对比,结果显示
看到结果我表示
翻阅 https://bugs.mysql.com 还没找到相关结果。
代码里面如何产生不同类型的值?
以下是开发(阿杜)自己的测试
目前的解决方式是和开发同学沟通让他们在程序做参数类型一致性校验,都转换为 int/long 类型。
特别提醒常见发生隐式转换导致索引失效的场景
1 where 判断符号左边是字符串 ,右边是数值 比如
where name = 123
2 多表join关联条件的字段类型不一致,类似于 1
3 多表join关联条件字符集类型不一样。比如
a 表 order_no 是utf8mb4 ,b 表order_no 是 utf8
感兴趣的 朋友可以多测试,有其他案例的 欢迎讨论。
以上就是记一次MySQL的优化案例的详细内容,更多关于MySQL优化案例的资料请关注开心学习网其它相关文章!
原文链接:https://mp.weixin.qq.com/s?__biz=MzI4NjExMDA4NQ==&mid=2648450549&idx=1&sn=475067207fc111af7244570b9014f87a&chksm=f3c97d1fc4bef409924c983edc7010b8c9c5427090ef2e6bc964fc6d118fd830635eeac42493&scene=21#wechat_redirect
- mysql数据类型和使用方法(MySQL数据类型全解析)
- mysql索引应该注意的地方(关于MySQL索引知识的小妙招)
- mysql 查询都是0的值(MySQL按小时查询数据,没有的补0)
- mysql mvcc 流程(Mysql MVCC机制原理详解)
- mysql删除的delete怎么找回(MySQL Delete 删数据后磁盘空间未释放的原因)
- zabbix监控sql server集群(zabbix 监控mysql的方法)
- SQL SERVER与MySQL数据类型的对应关系
- mysql效率查询(MySQL 如何分析查询性能)
- mysql 使用小结(Mysql Online DDL的使用详解)
- idea安装mybatis(IDEA使用mybatis-generator及配上mysql8.0.3版本遇到的bug)
- mybatis为什么还用mysql(关于MyBatis连接MySql8.0版本的配置问题)
- mysql忽略大小写(MySQL大小写敏感的注意事项)
- mysql百万数据分页查询优化方案(MySQL单表亿级数据分页怎么优化?)
- rabbitmq客户端内存占用(mysql-canal-rabbitmq 安装部署超详细教程)
- 适合小白入门的mysql教程索引简介(一篇带给你MySQL高性能索引)
- mysql连接查询原理(MySQL连接查询你真的学会了吗?)
- 今年考高会很难吗(今年高考会考试吗)
- 盘古开天地 他创造了世界,谁创造了盘古 盘古是伏羲吗(盘古开天地他创造了世界)
- 关于队徽 你了解这些么 二(关于队徽你了解这些么)
- 冬天来了手脚冰凉 真不是因为上辈子你是折翼的天使(冬天来了手脚冰凉)
- 0 1 岁婴儿最强作息指南,照着做养出天使宝宝(01岁婴儿最强作息指南)
- 沪上这16所高校 萌新 礼包开箱 哪一款让你心动(沪上这16所高校萌新)
热门推荐
- json和xml比较与区别
- mysql中length、char_length区别
- 怎么将mysql彻底卸载(如何把Mysql卸载干净亲测有效)
- 阿里云服务器怎么设置安全(详解阿里云服务器添加安全组规则图文教程)
- mysql查询慢有哪些原因(MySQL 查询速度慢的原因)
- vue pdf预览插件(Vue-pdf实现在线预览PDF文件)
- dockerpull镜像的过程(详解docker pull 下来的镜像都存到了哪里)
- nodejs请求页面(node.js+postman实现模拟HTTP服务器与客户端交互)
- python的静态方法和类方法(深入解析python中的实例方法、类方法和静态方法)
- apache服务配置详解(APACHE 多站点配置方法)
排行榜
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9