【七天深入MySQL实战营】答疑汇总Day4 MySQL查询优化实战
【开营第四课】【 MySQL查询优化实战】
讲师:苏坡,袋鼠云高级数据库工程师。
课程内容:核心概念及原理;优化流程思路;常见场景下的优化。
答疑汇总:特别感谢班委@李敏 同学
1. 除了 explain,会有好的办法调优 sql 吗?
观测 mysql 行为的方法主要有两种:
(1) explain sql 语句
(2)show processlist 详情见 ppt 22 页(查看当前活跃会话状态)
调优 sql 的方法还有两种:
(1)show profiles,一条 sql 语句执行过程当中,每一步的开销
(2) Sql 优化器的 trace,可以看到优化器在选择执行计划时的判断标准,分析 sql 的时候,需要临时开一下,帮我们去模拟生成执行计划的过程(参考 https://segmentfault.com/a/1190000018136007)
2.之前一直用 sqlserver,如果一个表 tbl,有 A、B 两个字段,且每个字段都建有一个索引,当执行 select * from tbl where A=? And B=? 时,mysql 会同时使用这两个索引查,然后将两个结果合并?
A:索引合并,是 innodb 优化器的一个比较典型的特征,通常来讲,发现一个sql语句出现索引合并的话,表示sql语句性能并不好,索引合并举例:and 交集,or 并集,一般来说一个表里面,建立了太多单列索引,就可能出现这种情况(索引合并)。看到(sql 语句)走的 a 和 b 两个索引,并且取的是交集,说明单个索引的过滤性并不是很好,建议改造成复合索引,建议大家一定要定期去检查表当中的索引,不要有太多单个的索引。
3.对于 8.0 的 explain analyze 有什么看法?8.0 的 hash join 之类的很多新特性,越来越接近 oracle,(老师)对于 mysql 的发展有什么看法?
A:8.0 的这个工具特别好用,推荐大家去使用,相比 5.6 和 5.7 的 analyze,8.0 的工具去分析问题的话,更为精确一些;不敢妄下结论,mysql毕竟从一个数据仓库的产品发展到现在,被收购 oracle 之后,oracle 的特性,在各个方面确实是比较完善一些,但 mysql 也并不是完全在接近 oracle,是在汲取 oracle 的一些特性吧。
4.Centos 下 Mysql 内存使用 1 个月内缓慢增长,直至数据库 OOM,kill 连接也不会释放,Mysql 内存参数已做限制,请问如何配置有效自动释放内存,个人查到 centos 内存调度算法 malloc 可以优化,但未实践(老师)在日常的工作上,也有碰到过内存相关的问题,做一些内存分析的工作之前,首先还是要看 mysql 是什么版本的,5.7 以前,分析内存可做的事情有限,比如分析数据库的会话和sql,推测某些操作会带来内存迅速升高,单从 mysql 的行为来去看(,不太好判断),5.7 之后,可以通过开启性能视图来分析,5.7 的性能视图还是比较丰富的,特别是内存这一块,建议感兴趣的同学可以去研究研究。
5.应用有两个数据源,一个是 mysql 8;一个是 mysql 5.7,用 8 版本的 jar 会对 5.7 的数据源有什么影响吗?这个应用在服务器的 tomcat 上部署旧报链接不上 mysql 8 的数据源,本地测试就可以,具体可以往那方面排查?
A:这个要不看一下 jdbc 版本的问题,关于连不上数据库的话,可能会报不同的原因,这个要有不同的报错出来(主要观察是报错内容,然后具体错误具体分析)。
6.sele
原创不易,完成人机校验,阅读全文