【开营第三课,MySQL Java 开发实战】
讲师:义泊,阿里云技术专家。
课程内容:深入浅出ORM框架MyBatis;连接池框架HikariCP和druid的剖析和最佳实践;Java应用性能问题诊断技巧。
答疑汇总:特别感谢班委@陈亮 同学
Q1: MySQL 联合索引所有列的时候,为什么任意条件查询都会命中索引?
A1:比如表在A、B、C三列建了联合索引而且三列的顺序是ABC,如果查询条件是ABC字段或者AB字段肯定是会命中索引的,只有A字段也会命中索引,但是只是BC字段或者C字段是无法命中的。
Q2: mysql对于如订单主从表开发,订单主表的数量合计,金额合计是查询时通过select sum实时查询好,还是在主表设计合物理字段,当从表数据发生变化时写入物理字段好?
A2:实时查询对数据的准确性是最好,但设计合计字段会有维护成本,需要看你实际的应用场景,做相应的取舍。比如只是统计订单的销量,对数据准确性和实时性要求不高,可以考虑用合计字段。
Q3: mysql跨异构库关联查询,如跨sqlserver。有没有sql层面的实现方案,用多数据源+java编码实现很麻烦?
A3:在DB层面mysql不支持跨异构数据源的查询,反向sqlserver可以用link等方式实现。
Q4: MySQL 联合索引所有列的时候,为什么任意条件查询都会命中索引?
A4:同Q1。
Q5:复用数据库连接池,mybatis一级缓存会自动释放么?
A5:建议参考《深入理解mybatis原理》,其中详细讲解 了一级和二级缓存机制。
Q6:分库分表一般建议开发程序改造还是使用中间件透明分片?
A6:在电商体系这两种方式都有。一般用Cobar较多,进行水平拆分和垂直拆分。
Q7: MySQL内存消耗逐渐升高直至OOM,内存参数已限制,该如何自动释放centos下的连接内存占用?
A7:如果是基于硬件条件的限制导致只能通过关闭连接来释放内存,需要考虑应用设计上是否需要优化,另外硬件本身的规格参数是否匹配。此类情况除了相关的性能调优,仍需要日常进行各项性能指标监控,找到问题真正原因去解决。自动从进程或线程关闭连接数解决不了根本问题。
Q8:一个系统应用最多连几个数据源
A8:取决于系统应用的需要,通常十个及以上都可以,看实际应用场景。
Q9:问当缓存穿透,多个请求命中同一个锁,怎么保证快速返回,不发生死锁?
A9:如果都是查询,共享锁是可以并发查询的,如果有更多事务更新会导致block。后面请MySQL内核方面专家来分享。
Q10: CPU生产火焰图工具只适用JAVA语言么
A10:火焰图跟语言没有关系,输入固定的数据结构就会返回相应的图形。如果要剖析到某个语言内部,需要看语言是否支持拿出内部堆栈再进行分析。
Q11:我有个问题,前几天遇到公司一个故障,就是网站访问忽然卡动,不是连续的,如果从 Java 方面的话,看那些方面?这个大致会是那几个方面的问题?
A11:原因很多,比如网络阻塞,数据库有慢查询做DDL等,java应用代码占用CPU过高,依赖第三方接口时接口响应慢,都可能影响性能。这种情况建议通过建立DB层、系统层、java应用层的性能监控指标去分析从而判断故障点。
Q12:如果服务器cpu到百分之90以上,一般没响应,这时候不重启服务器如何,处理比较好?
A12:这个问题与Q12相似,还是要通过监控指标去找到实际原因,解决本质的问题。另外通过一些命令比如查看进程和线程的状态等等去辅助判断。
Q13:项目中采用druid进行多数据源配置的时候,怎么保持事务一致性
A13:可以考虑用分布式事务。
Q14:多张大表(亿级别)inner join,性能如何提高,走了索引的
A14:几个层面去看,数据量以及数据分布的影响,不同数据类型的索引类型是否合适以及mysql版本等等。如果可以优化的参数都已调优,关注热点数据是否都在cache中,合理的拆分数据去解决。
Q15:haotim,应用使用hikari数据库链接池,时不时报错,communication link failure
但是数据库wait time out设置8小时,连接池默认是maxlifetime是30分钟,还有什么排查思路呢?
A15:要看是否连接池里面的报错,还是后台mysql的连接是否正常。关注后台的hikaricp 活跃连接数,需要看具体的问题进行分析。可以看hikaricp的官方文档进行排查。
Q16:之前用druid连接池,有遇到提示表或视图不存在,但是实际存在,需要重启数据库才能恢复,不知道这种问题应该从哪方面开始排查?
A16:是否druid连接在重启后自动重连,需要看实际情况分析。