刚到公司不久,才知道公司产品在性能上有问题,数据量和并发数一大,系统就很慢,需要优化。在和公司同事讨论某模块优化,通过sql无法优化,因为系统sql是判断5个纬度,一个用户id, 一个机构id,一个岗位id, 还有级别判断和是否公共。
有5个”or“组成查询,表数据一大就表扫描,性能很差,但业务要求和系统要求这样判断。即使在表中这五个字段都建索引,速度也不会快。太多"OR"了,SQL Server 查询分析器无法优化。
SQL语句这时无法优化了,但是如果重新设计表又对现有系统改变太大了,只有对表进行微调。
讨论两天后,终于达成一致:
1,将一个用户id, 一个机构id,一个岗位id,是否公共存四个字段合并成一个字段中,因为我们系统只记录一个,只要符合一个可以了。在再该字段建立索引,程序在前台传进个字符窜,包含上面四个,然后用in来匹配。
这样重构,速度比以前要快,程序修改也比较少,是一个比较平衡的解决方法。但这不符合数据库的设计范式:一个字段有多个意义。设计数据库时不要使用,
只是在没办法优化的情况可以考虑。