发表于: 2017-08-17 22:11:57
1 1102
今天完成:
无
收获:
1.三天前老大的一个问题:如何查询公司发布的职位数量效率最高?
Select count(1) from occupation where company_id=x;
想不出再优化的办法了,之能这么写吧?
2.反思了一下DB的设计,找到一些不合理的地方:
1.mysql中boolean应该用tinyint,db里则使用了int,增加了空间占用。
2.db里一些字段如phone、country使用了varchar,但最好使用数字类型。字符型会降低查询和连接的性能,并会增加存储开销。这是因为引擎在处理查询和连 接时会逐个比较字符串中每一个字符,而对于数字型而言只需要比较一次就够了。
3.Db设计较为混乱,是否为空每个表都不统一。建议最好不要给数据库留NULL,尽可能的使用 NOT NULL填充数据库,并赋默认值。因为如果为空,使用子查询查询非主键的字段就可能有空值null,这时就必须加is not null/is null做判断,加这个判断会使索引失效。而且不管是否为空,db里该数据类型占用的空间是一定的(除了varchar),建议赋默认值0/1。
4.db里没加索引,除了主键自带索引其他的使用dal生成的时候似乎没加进去。应在一些表连接字段和查询频繁的字段上加上索引,其他一些字段可以不考虑,就算加索引,每张表的索引数量也应不超过6个。
5.在dal里面使用了%xx%的模糊查询。会使索引失效而进行全表扫描,而且由于匹配算法的原因,模糊查询字段越长,效率越低。如果一定要使用模糊查询,可以使用右模糊查询‘xx%’,这种是走索引的。全模糊查询没法优化,可以考虑建全文检索,再不行可以用搜索引擎。不知道在dal里写全模糊查询是怎么处理的。
3.
匿名内部类:以类似构造方法的形式创建匿名类。创建匿名内部类调用方法,同时会创建一个对象。
应用范围:仅需要使用一次的类
getJdbcTemplate().update(new PreparedStatementCreator() {
public PreparedStatement createPreparedStatement(Connection connection) throws SQLException {
PreparedStatement psst = connection.prepareStatement(sql, new String[]{"id"});
psst.setString(1, permission.getPermission());
psst.setString(2, permission.getDescription());
psst.setBoolean(3, permission.getAvailable());
return psst;
}
}, keyHolder);
问题:
无
计划:
写复盘
进度:
延期
角色权限模块快写完了
评论