以架构师的思路和视野理解 MySQL的索引、锁、事务、分库、分表

很多人写了多年业务代码,但对 MySQL 没有太多深层次的认识,只停留在 CRUD 层次,能满足业务逻辑就万事大吉。然后MYSQL并不只是懂“增删改查”、表关联就万事大吉了。

千万条数据,走索引还是慢,怎么解决?

千万级数据,分库分表怎么做?

主从延迟怎么解决?

业务规模小的时候岁月静好,一旦业务量快速增长,就会面临很多棘手问题:

大规模数据导入会导致 MySQL 读性能大幅降低,甚至还有锁表情况;

MySQL 在大查询方面性能很差,盲目限制会导致用户体验变差;

MySQL 对数据量的支持有限,如果过大,查询就会变慢。

基础软件三大件:操作系统、中间件、数据库,发展到现在,操作系统在云化、容器化的时代重要性被弱化了,中间件在分布式体系下更容错了,唯独数据库依然是块难啃的骨头,应用广泛的 MySQL 首当其冲。

MySQL 不仅在面试环节是被反复考核的考点,在实际工作中更是能够发挥极大价值。但对于很多开发者来说,常常会有一个错觉,面试造火箭、入职拧螺丝…我曾经也有这种感受,后来慢慢理解了这并非 MySQL 的锅!

底层技术的发展会激发上层业务的需求,而上层业务的需求同时会为底层的技术带来新的挑战。数据库需要承受更多的高并发已经成了架构设计不得不考虑的点。

解决方案有很多,如何选择、如何权衡?

短距离、少数据、分散压力是我们可以考虑的方向,这其中牵扯到页面静态、使用缓存、批量读取、延迟修改、使用索引、分库分表、建立主从等等…

面对这样的技术要求,开发人员的难点往往在于虽然平时会摄入大量知识,但无法利用这些知识构建起稳固的大厦,形成系统知识结构,这就导致停留在机械的应用层面,无法根据业务场景与底层逻辑进行匹配,最终无法形成解决问题和举一反三的能力。

我们服务于业务,问题的根源也在于业务量极大或者场景复杂,面对这样的状况,我们需要清楚解决的基本逻辑。

(MySQL逻辑架构)

拿MySQL优化来说,主要分4个方向:SQL语句跟索引、表结构、系统配置、硬件。总优化思路就是最大化利用索引、尽可能避免全表扫描、减少无效数据查询:

1、减少数据访问:设置合理的字段类型,启用压缩,通过索引访问等减少磁盘 IO。

2、返回更少的数据:只返回需要的字段和数据分页处理,减少磁盘 IO 及网络 IO。

3、减少交互次数:批量 DML 操作,函数存储等减少数据连接次数。

4、减少服务器 CPU 开销:尽量减少数据库排序操作以及全表查询,减少 CPU 内存占用 。

5、分表分区:使用表分区,可以增加并行操作,更大限度利用 CPU 资源。

当然,掌握了这些基本原则,我们还是会面临一些难题。比如通过分表来解决大表问题,分表是为了减小数据库的压力,缩短表的操作时间。

如何进行数据切分?垂直切分(纵向切分),是对不同的表(或者Schema)进行切分,存储到不同的数据库(主机)之上。水平切分(横向切分),是对同一个表中的数据进行切分,存储到不同的数据库(主机)之上。规则是根据表中数据的逻辑关系,按照某种条件拆分。

分表主键如何选择?分表后的跨表查询怎么解决?大事务会导致锁定太多的数据,造成大量的阻塞和超时,出现主从延迟,这要通过什么方式来改善?

MySQL确实是个庞杂的体系,掌握的越深入,我们能做的事情也就越多。希望大家继续学习!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值