“这数据库设计的稀烂,查询慢的要死,这谁设计的数据库啊!”

——某项目经理的咆哮

从业这么多年,一直在思考怎样才算一名合格的数据库开发工程师?是需要会各种奇淫技巧的开发方法,还是要会各种鬼斧神工的运维能力,不得而知。我的理解是一个好的数据库开发工程师应该在具备开发能力的同时,还需要遵守一些通用的规则,方便前端开发人员去使用,同时也要方便业务人员理解整个结构设计。

百度百科给数据库开发工程师的定义是:

数据库开发工程师(Database Developer)是从事数据库管理系统(DBMS)和数据库应用软件设计研发的相关工作人员的统称,他属于软件研发工程师,但又有一部分运维工作的内容。他主要从事软件研发的工作,但同时也要参与数据库生产环境的问题优化和解决。

从定义中不难看出,一个数据库开发工程师不仅要懂研发,还要考虑数据库在实际生产中的性能。就像开头某项目经理咆哮的那样,一个不好的数据库设计,会拖慢整个数据的查询效率。

最近接手一个房地产中介系统的数据库优化任务,使用的是阿里云的Mysql数据库,配置中等,但是据业务反应每次查询房源和客源信息都非常慢,少则20多秒,多则一分多钟。当时听了这个反馈第一反应是数据量应该很大吧。等我去查看相关表的数据量才发现不超过100万条数据。在我遇到的项目中,100万以内的数据,单表查询不到一秒,他们这是怎样的一个查询语句居然要一分多钟?等到我慢慢深入才发现这数据库真的就是某项目经理咆哮的那样。

所有表结构设计完全是按界面字段进行填充,一个界面一个表,有些表的字段多达60多个,而且大部分在其他表也可以找到,好些字段一直未使用,索引除了主键,其他所有字段合在一起建立的联合索引。当时看了这样的设计我也想像某项目经理那样咆哮!

我可以理解设计数据库的人的想法,在能保证项目能顺利完成的前提下,数据库只是一个放数据的地方,我把需要的数据都给你塞进去就行了。就是这么简单,就是这么任性!诚然,数据库确实是存放数据的地方,但是这只是他最基本的一个功能,他在存放数据的同时还能够处理业务逻辑等。我们存放数据后更多的是去使用这些数据,如果使用的过程中体验不好那这就不是一个成功的产品。所以请收起你的那套只要项目完成就行的幼稚想法。没人用,完成了的项目有什么意义?

最后我给的建议是所有表需要重建的重建,查询语句需要优化的重写。但是因为表重建对项目的调整较大,第一条放弃了。只能对查询较慢的语句进行优化。真的,当你写一个查询语句,语法没有问题,但是查了半天数据库都不出结果,你会不会很抓狂?反正我要是遇到这样的查询语句,我一定要看看是哪里出问题导致这么慢。这里就涉及到数据库开发中比较重要的一块,就是性能的优化。这一部分我个人认为是成为一名合格开发工程师的试金石。你会写存储过程,触发器,游标又如何,写出来的东西一团糟,完全出不了结果那也是做无用功。

曾经学的《数据库原理》一书,我觉得上面就是告诉你数据库是如何运行的一个过程,虽然都是一些基层理论知识,但是对数据库的设计与开发会大有裨益。性能的优化也是建立在对数据库运行原理比较了解的基础之上的,抛开原理去埋头苦干的优化,结果可想而知,所以工程师们,请好好对待你使用的数据库吧,他虽有天大的本事,也需要你正确使用才能发挥其作用。