问题沉淀「一」

关键字: mysql字符编码索引介绍项目跨库跨表关联

问题: 在 join 操作时,为什么 MySQL 编码不同,性能差距很大。
解决方案:
  问题字符集转换遵循由小到大的原则,因为utf8mb4是utf8的超集,所以这里把utf8转换成utf8mb4,即把t1.code转换成utf8mb4字符集,转换了之后,由于t1.code上面的索引仍然是utf8字符集,所以这个索引就被执行计划忽略了,然后t1表只能选择全表扫描。更糟糕的是,如果t2筛选出来的记录不止1条,那么t1就会被全表扫描多次,性能之差可想而知。链接:MySQL表字段字符集不同导致的索引失效问题


问题: MySQL的最左前缀在第一字段不存在的情况下,为什么使用到了索引?
解决方案:
  可以认真阅读这篇文章。链接:mysql索引最左匹配原则的理解? - 知乎


问题: 面试中面试官让谈一谈 MySQL 中的索引,怎么回答比较好?
解决方案:
  MySQL是很常用的数据库,其中改善性能最好的方式,就是通过数据库中合理地使用索引。因此,首先可以谈谈在项目中如何设计索引。其次,索引使用的注意事项有哪些,例如复合索引的最左前缀原则,范围查询对多列查询的影响等。最后,如果面试官对原理比较感兴趣,可能再聊聊数据库索引的原理,为什么要用 B-tree,聚集索引与非聚集索引的区别这些问题。此外,加分项,还可以说说自己在项目中,遇到了哪些索引的难点,例如之前提到的编码转换的索引失效问题,以及通过曲线救国的方式满足业务场景。


问题: 如何介绍项目
解决方案:
  面试官问这个问题,主要是考察你的概述能力和全局视野。当然,今天我们聊的并不是面试题,而是我们怎么去理解和复盘我们每天做的事情。有的人经常抱怨自己每天在堆业务,但没有成长。事实上,很多情况下确实在堆业务,但并不是没有成长的。并非做中间件或者技术架构才是成长,例如我们的需求分析能力,沟通协作能力,产品思维能力,抽象建模能力等都是一个非常重要的硬实力。首先,请你静下来思考,你真的了解自己每天在做的事情吗,你真的了解自己所做的业务吗?

好的,现在进入正文,我们如何理解和复盘项目。这里,列了一个清单,请大家好好思考下这些内容。

  1. 明确项目的周期。
  2. 明确项目的价值。(为什么做这个项目,它解决了用户什么痛点,它带来什么价值?)
  3. 明确项目的功能。(这个项目涉及哪些功能?)
  4. 明确项目的技术。(这个项目用到哪些技术?)
  5. 明确个人在项目中的位置和作用。(你在这个项目的承担角色?)
  6. 明确项目的整体架构。
  7. 明确项目的优缺点,如果重新设计你会如何设计。
  8. 明确项目的亮点。(这个项目有什么亮点?)
  9. 明确技术成长。(你通过这个项目有哪些技术成长?)

问题: 分库与分表,联合查询就遇到跨库关联和跨表关系问题,那应该怎么办?
解决方案:

  1. 其实,数据量小的情况下,怎么使用都没有问题的。
  2. 如果在数据量大的情况下,不一定分库分表,单库也不行的。看阿里编码规范,禁止存储过程,尽量不要使用join,有也不要超过3个。
  3. 联合查询不一定性能就差,如果很多join,都能用到主键或者唯一键性能也不差的。
  4. 业务解偶,单张表也能更好缓存。
  5. 在单库单表的情况下,联合查询是非常容易的。但是,随着分库与分表的演变,联合查询就遇到跨库关联和跨表关系问题。在设计之初就应该尽量避免联合查询,可以通过程序中进行拼装,或者通过反范式化设计进行规避。

Reference:

  • 梁桂钊的知识星球 –「服务端思维」
-------------本文结束感谢您的阅读-------------
Thank you for your encouragement