【开营第五课】【MySQL 开发规约实战】
讲师:芦火,阿里云运维专家。
课程内容:SQL语句编写规范;事务的使用与优化;开发中的常见问题与最佳实践。
答疑汇总:特别感谢班委@陈亮 同学
Q1:根据主键进行update ,只修改一个字段,经常出现超过0.5秒的情况,请问这样的问题怎么排查?
A1:update慢通常是阻塞问题比较多,大多数是长事务导致,建议看实例级的性能,关注锁的性能,IO争抢、内存争抢,多从资源上分析是否有问题。如果是主键基本上不是索引的问题。
Q2:老师好,请问事务发生多层循环调用,怎么保证强一致性?
A2:mysql嵌套事务不支持,在实际场景尽量从开发级别去保证。
Q3:insert插入过慢,几百条记录要插几秒中,有哪些排查思路?
A3:插入问题通常不会因为锁问题,在主从架构通常半同步,要去看是否有DML。可以考虑把从库异步关掉再看从库情况,尽量不要在循环里写一个事务,需要按方法论进行排查。
Q4:数据表字段名大家都要求用小写+下划线 ,统一用驼峰行不行?会出现什么大小写问题?
A4:开发规范适合公司内部使用就OK,内部风格统一就好。没有强制说必须使用哪一种;大小写的问题要看开发语言对大小写是否敏感。
Q5:从5.7迁到8.0,有哪些需要注意的点?单实例最多可以建多少个库呢?
A5:从5.7到8.0,都要注意兼容性的问题,然后验证业务是否正常运行。比如新的关键字,取消的语法,字符集,8.0某些变量取消,8.0order by在索引返回数据方面等等,在课程中有特别讲到,可以再回看一下。
Q6:mysql 优化时候,比如有时候需要对字段做类型转换或者加函数,走不了索引,除了用虚拟列去优化(耗费空间换时间),还有什么优化思路?
A6:通常虚拟列,日期列,如果是特别复杂的函数也无解。在b-tree索引上基本就是这些用法。
Q7:要小表驱动的时候,是要把 ignore 写到 sql 里吗?还有别的方法吗?
A7:建议在SQL中尽量减少带指定业务逻辑,比如索引改名了,会带来索引失效问题。尽量取消强制索引,对开发透明。
Q8:怎么优化模糊查询,使用哪个关键字销率比较高?
A8:尽量少用。
Q9:开启 optimier_trace 会带来多大的开销,实际环境中应当怎么使用?
A9:可以忽略不计,通常不会在生产环境中一直开启。
Q10:explain、analyze 会实际执行 sql 吗?
A10:会。Explain不会,它只生成计划树。Explain Analyze 8.0才有,它会实际执行。可以参考官方文档https://dev.mysql.com/doc/refman/8.0/en/using-explain.html
Q11:mysql memcached 插件成熟吗?生产使用是否合适?
A11:不建议把插件集成到关系型数据库中用,专库专用,缓存用Redis,类似这样。
Q12:mysql 树结构查询有什么比较好的方案吗?
A12:在8.0里面有cte,之前通常用函数去实现树结构。
Q13:mysql有无SQL优化建议插件?
A13:建议先了解工具原理和sql原理。
Q14:mysql开发在表关联方面有什么技巧和需要注意的地方?对于10张表以上的关联大查询,该如何优化或拆分?
A14:在写SQL时要有结果集思维,大表和多表关联如何让结果集最小才是最优考虑的。充分用好index,业务上如果可以分步获取数据,可以考虑拆分。
Q15:mysql如何分析指定时间段内的历史数据库会话?有无插件可以记录?
A15:有。一些第三方工具可以支持,可以网上找找。阿里云的审计功能非常全,建议先了解。如果自己实现,可以参考一下阿里云的实现。
Q16:对于高效SQL编写,有无较好的引导工具可以使用?
A16:建议先了解工具原理和sql原理。
Q17:同一条sql主从执行计划一致,执行时间不一致,这种情况如何优化;还有同一条sql主从计划不一致的问题?
A17:基本上不太可能。只可能在某个节点上资源不均匀,数据没有在buffer pool里,冷数据需要走IO看看时间能不能对齐。如果一条sql的主从执行计划不一致基本上统计信息的问题,要去更新统计信息。如果还不准可能就是采样率的问题,因为从库是slave回放可能跟主库的数据分布不一样,可调大采样页数去观察分析。
Q18:mysql的save point,算是支持嵌套事务吧?
A18:save point是跟开发强相关,跟递归也没有什么相关性。