相信现阶段依然有许多的企业信息化项目依然采用单体架构,其数据存储主要方式依然以关系型数据库为主,比如oracle、mysql、postgresql等。企业初期,各种原因导致研发人员身兼数职,都是全栈的角色。当然从业务上来说,用户量不大,并发数小,只要实现需求功能就可以了。当系统运行到一定数量级,一定会面临数据库的查询问题。下文从数据库设计和查询简单说说怎么提高查询性能。
一、数据库设计
1、使用范式设计合理设计数据库,为了考虑性能,可不用实现全部范式。在实践中使用第一和第二范式即可(具体范式规则可问度娘)。
2、表字段使用合理的数据类型,尽量不用blob、clob、text等大字段,如必须使用,可增加扩展表,从需求上,这些大字段在列表查询时不用展示,在展示详情时再发起查询即可。对于图片和视频等,只保存路径信息,实际文件保存在文件系统中。
3、在条件查询字段增加索引,索引是传统模式下,性能提升的利器。在不增加任何硬件的前提下,索引可以大大的提高应用查询效率。
4、数据库端不做任何外键,在应用端负责外键引用。这里需要注意的是,有A(id),B(id,aid),设计这种表的时候一定要注意关联字段的数据类型必须要一致。A表中id字段是int8,那么B表中aid字段就必须设置为int8,而不能用varchar字段。
二、查询优化
1、使用exists替代in。
开发人员由于不考虑数据查询效率,使用exists可以使用表索引,从而提升效率。当前前提是exists的结果集是一个大结果集。如果目标结果集只是几十条数据,使用in也是可以的。
2、尽量少用子查询。
子查询的性能很低,建议使用表连接的方式来优化。
3、优化or查询。
实际开发中or查询常见,可以通过union中改变or为两条and语句来提高查询效率。
4、不滥用多字段like。
业务方喜欢在前端页面使用一个输入框实现多字段检索。实现方式通常是多字段or加like。这里推荐一种改善方案,在前端把查询字段明确化,去掉一个输入框接收查询参数。如果有技术力量,可以加上搜索引擎,则可以解决这个需求。
三、应用程序优化
1、在应用程序中采用合理的数据结构来存储相应的查询结果数据。
2、在业务逻辑层中尽量加快运算,较少不必要的时间消耗,比如多次进行集合的遍历。
以上从数据库设计和查询两个方面简单阐述了如何提升查询性能。查询优化是一个研发团队的核心竞争力,在初创阶段,业务为王,技术是辅助性的。但是,技术也需要紧紧贴合业务,避免由于技术债务导致业务不能快速发展。应用性能提升之道任重而道远,欢迎交流。