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 查询json(MySQL处理JSON常见函数的使用)
- mysql高级变量查询(MySQL 使用自定义变量进行查询优化)
- mysql索引面试总结(Mysql数据库索引面试题程序员基础技能)
- mysql生成唯一订单号(MySQL高并发生成唯一订单号的方法实现)
- mysql5.7.20非安装版教程(MySQL5.5 部署的一个问题)
- dockermysql配置详解(Docker 部署Mysql 服务和Redis 服务的方法)
- 最新版MySQL 8.0.22下载安装超详细教程(Windows 64位)(最新版MySQL 8.0.22下载安装超详细教程Windows 64位)
- mysql的7种索引(浅入浅出 MySQL 索引)
- mysqlsql语句的优化(MySQL优化之如何写出高质量sql语句)
- 合理设置服务mysql最大连接数(MySQL正确修改最大连接数的3种方案)
- mysql新增字段语句(关于Mysql update修改多个字段and的语法问题详析)
- centos系统mysql安装及连接教程(CentOS8安装SQLServer2019的过程)
- mysql事务级别设置(mysql在项目中怎么选事务隔离级别)
- python mysql配置(详解python校验SQL脚本命名规则)
- mysql删库操作记录(mysql常用sql与命令之从入门到删库跑路)
- mysql常用优化方法(理解MySQL查询优化处理过程)
- 高马尾扎发(高马尾扎发教程视频)
- 这里输入关键词(请手动输入关键词)
- 小说 顾瑾岚拿出一套飞行棋,别说你连飞行棋都不会哦(顾瑾岚拿出一套飞行棋)
- 金品公司 界界乐中秋限定飞行棋礼盒 露营藤篮礼盒全新上市(界界乐中秋限定飞行棋礼盒)
- 必看 8月,相比七夕,更需要注意的是这些事(必看8月相比七夕)
- 8月23日11时16分将迎处暑,逐渐进入气象意义上的秋天(8月23日11时16分将迎处暑)
热门推荐
- sql server显示当前登录用户命令(SQL Server正确删除Windows认证用户的方法)
- python 装饰器模式(python重试装饰器的简单实现方法)
- APP界面设计的建议
- mysql修改初始密码教程(使用MySQL命令行修改密码)
- mysql怎么迁移数据(如何把本地mysql迁移到服务器数据库)
- 程序员如何快速适应新工作
- zabbix监控页面(Zabbix WEB监测实现过程图解)
- 查看linux服务器开放哪些端口(详解Linux服务器最多能开放多少个端口)
- sqlserver查询表结构(sql server递归子节点、父节点sql查询表结构的实例)
- 宝塔面板终端密码错误(Bt宝塔面板忘记用户名密码的具体情况分析和解决应对)
排行榜
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9