海量数据处理的SQL性能优化
1 设计阶段的优化 1.1 表设计 1.1.1 范式化 数据库设计三范式定义: 1. 第一范式:每个字段只包含最小的信息属性。 例如常见的学号:入学年份+班级+编号,是不符合第一范式的,需要将其拆解为:入学年份、班级、编号。 2. 第二范式:(在满足第一范式基础上) 模型含有主键,非主键字段依赖主键。 3. 第三范式:(在满足第二范式基础上) 模型非主键字段不能相互依赖 。 例如订单表,一般来说订单表的主键是订单号。在此表中,字段下单时间、客户ID是符合第二范式的,而客户姓名这个字段就不满足第二范式,应当放入客户表内,组成客户ID客户姓名。 范式化的设计能有效降低数据冗余,更新方便快速,降低了数据不一致的风险。故常见于联机交易型的数据库。 1.1.2 反范式化 有意不符合范式化的设计,常见于反第二第三范式。 符合三范式的设计在降低冗余的同时也带来了问题。如果需要对数据进行加工处理(例如具有订单表、客户表,需要统计某个年龄的客户的订单总金额)的时候,需要不断进行关联操作。当订单数量极为庞大的时候,这个关联操作所需要消耗的资源将会相当巨大,导致查询性能低下。因此在数据仓库的海量数据的处理中,常使用反范式化的方式进行设计来提高性能,用空间换取时间。例如在订单表内添加上下订单的客户的生日,则只需直接执行筛选即可。 反范式化的设计并没有定势,需要视具体的业务而定