poptest老李谈数据库优化总结
poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性能测试,测试工具开发等工作为目标。如果对课程感兴趣,请大家咨询qq:908821478,咨询电话010-84505200。
1).对查询比较平凡的表中的列加索引;
2).对像数据字典类型的表我们可以在程序启动过程中就加载到非关系数据库。
3).对sql的优化:
1.包含时间段的列的表,尽量每次查询都需把时间带上;
2.select语句中用具体的列代替“*”;
3.根据表中的数据情况,选择最优的表名顺序;
4.减少数据库的访问次数(比如:获取用户权限,不要递归查询);
5.注意关联、group by的使用;
6.使用EXISTS、NOT EXISTS 代替in、not in。他们的效率比in、not in(它不能应用表的索引) 高很多。
注:ORACLE试图将其转换成多个表的连接,如果转换不成功则先执行IN里面的子查询,再查询外层的表记录,如果转换成功则直接采用多个表的连接方式查询。由此可见用IN的SQL至少多了一个转换的过程。一般的SQL都可以转换成功,但对于含有分组统计等方面的SQL就不能转换了。
7. IS NULL 或IS NOT NULL操作(判断字段是否为空)
判断字段是否为空一般是不会应用索引的,因为索引是不索引空值的。不能用null作索引,任何包含null值的列都将不会被包含在索引中。即使索引有多列这样的情况下,只要这些列中有一列含有null,该列就会从索引中排除。也就是说如果某列存在空值,即使对该列建索引也不会提高性能。任何在where子句中使用is null或is not null的语句优化器是不允许使用索引的。
推荐方案:用其它相同功能的操作运算代替,如:a is not null 改为 a>0 或a>’’等。不允许字段为空,而用一个缺省值代替空值,如申请中状态字段不允许为空,缺省为申请。
4).对代码优化:
1).使用mybatis、spring jdbc 代替hibernate;
2).减少对数据库的查询;
2).对像数据字典类型的表我们可以在程序启动过程中就加载到非关系数据库。
3).对sql的优化:
1.包含时间段的列的表,尽量每次查询都需把时间带上;
2.select语句中用具体的列代替“*”;
3.根据表中的数据情况,选择最优的表名顺序;
4.减少数据库的访问次数(比如:获取用户权限,不要递归查询);
5.注意关联、group by的使用;
6.使用EXISTS、NOT EXISTS 代替in、not in。他们的效率比in、not in(它不能应用表的索引) 高很多。
注:ORACLE试图将其转换成多个表的连接,如果转换不成功则先执行IN里面的子查询,再查询外层的表记录,如果转换成功则直接采用多个表的连接方式查询。由此可见用IN的SQL至少多了一个转换的过程。一般的SQL都可以转换成功,但对于含有分组统计等方面的SQL就不能转换了。
7. IS NULL 或IS NOT NULL操作(判断字段是否为空)
判断字段是否为空一般是不会应用索引的,因为索引是不索引空值的。不能用null作索引,任何包含null值的列都将不会被包含在索引中。即使索引有多列这样的情况下,只要这些列中有一列含有null,该列就会从索引中排除。也就是说如果某列存在空值,即使对该列建索引也不会提高性能。任何在where子句中使用is null或is not null的语句优化器是不允许使用索引的。
推荐方案:用其它相同功能的操作运算代替,如:a is not null 改为 a>0 或a>’’等。不允许字段为空,而用一个缺省值代替空值,如申请中状态字段不允许为空,缺省为申请。
4).对代码优化:
1).使用mybatis、spring jdbc 代替hibernate;
2).减少对数据库的查询;
3).对有时间段查询的,尽量传查询时间参数;
数据量比较大的大情况
1).对数据进行实时的备份,一定时间内对实时数据库中的数据进行清理;
2).对于具有统计功能的,采用数据拉取工具定时对数据进行统计并把统计结果放入统计表中;
3).对数据表进行水平和垂直分割;
4).采用集群方案;
5).对数据量大,关联性不强,查询也非常少的数据可以放到性能比较好的mongodb中;