很长一段时间我对数据库的认知仅仅停留在基本的CRUD上,直到接触了打造扛得住的MySQL架构这门课程。在一个大型的系统中数据库一直是性能的瓶颈,因此出现了很多的缓存技术,例如redis和memcached,但是如果数据库本身的设计不当,再怎么缓存优化也是收效甚微。这门课程简直有一种惊艳的感觉!我竟然第一次知道MySQL数据库背后还有如此常用的数据结构,例如:hash索引底层实现是hash表,B树索引底层数据结构是B+树;操作系统知识也在数据库中应用得淋漓尽致,例如:顺序IO要快于随机IO,RAID的分级,内存分页以及页的换入换出。
技术分为术和道两种,具体的做事方法是术,做事的原理和原则称为道。很多具体的技术很快就会从独门绝技到普及,最后落伍。追求书的人一辈子很辛苦。只有掌握了道才能够做到游刃有余。追求“术”的人多半抱有侥幸心理,想走捷径。但是宝剑锋从磨砺出,梅花香自苦寒来,真正做好一件事没有捷径,需要10000小时的专业训练和努力。 ——吴军·《数学之类》
做好MySQL性能优化,理解其背后的数据结构至关重要。除了这一点外,这门课程也指出了一些数据库设计中常见的一些误区,例如:很多人误以为int(10)比int(4)浪费更多的存储空间,实际上这是不对的,只有char和varchar类型数据宽度才是有意义的。很多人喜欢使用varchar类型,但是却不知道对于定长字符串(例如md5值)或者频繁更新的长度相近的字符串,使用char类型更为合适。因为varchar需要占用额外的字节存储字符串长度,更新的时候也会产生碎片。针对业务的需求选择合适的数据类型至关重要,因为正式上线后再次修改数据库结构将会是一场灾难。
课程的后面部分介绍了SQL调优,如何通过慢查日志和SQL的查询计划发现有问题的SQL。理解这一部分需要了解从SQL语句发出到得到结果这期间都发生了什么,哪些过程造成了查询效率低下,请看如下的MySQL体系结构图:
MySQL的查询缓存使用的是大小写敏感的哈希实现,只有相同的SQL才会命中缓存,查询解析器就是分析SQL语句的语法生成一颗抽象语法树,而查询优化器则是根据查询计划选择MySQL自己认为合适的计划执行。接下来就是存储引擎层。存储引擎使用InnoDB即可支持大多数应用场景,但是想archive这种存储引擎就比较适合用于log,ETL这种只读应用中。
关于MySQL优化,还需要大量的配置,例如磁盘和操作系统配置,网络和内存参数等等。
人生不止眼前的苟且,还有诗和远方。最后一句话和大家共勉:拼来的才是人生,等来的只能是命运。最后用一位老师的话收尾吧:如果学习的硬件和软件资源已经具备,那么接下来的事情就是保持一颗永远向上的心,如果学习累了,遇到困难了,遇到挫折了,那么就想想那些精美的、绝妙的功能,想想这些功能将来也会出自你的手中,相信每一位同学都可以成为JAVA开发大师的。