a.建表、写sql要注意性能方面的点
建表结构尽量简单(单个表字段不要多,可以通过关键字段建扩展表和详细表,数据量太大的可以考虑分表)。常用查询字段并且数值分散度高的建索引写sql的时候:尽量不要出现子查询或查询结果作为临时表这样的结构,因为子查询的时候不会走索引,如果是一张大表会很慢;where条件的时候,将能过滤出最小结果的条件放在最前面,这样在执行过滤的时候,会数据量越来越小;注意联合索引的时候,联合索引里最左边的字段一定要出现在where条件中,才可以在想用联合索引的时候,保证运行;注意会导致索引失效的情况。
b.合理使用缓存memcache
对于不需要即时更新的数据,可以合理使用缓存(保证缓存存储的维度,设置合理的缓存时间,这里可以考虑到运用md5处理后的信息作为缓存的key)
c.合理使用消息队列rabbitmq
对于不需要即时写入数据库,但需要按照顺序写入数据库,且不影响读数据库的情况的数据,可以使用消息队列rabbitmq将一个时间段内的数据收集起来,然后统一写入数据库(这种数据要允许丢失,一旦rabbitmq异常,数据就写入不了)。
d.合理使用搜索引擎solr
搜索引擎solr是在建立文档索引后,便于程序搜索的。检索文档型索引比数据库快,所以在查询的时候可以合理选择是否需要用到solr索引。用到solr的可以从两个方向考虑:一个是分词(导入词库,在指定字段选择分词模式,query查询的时候就可以将输入的关键字进行分词后的检索了),一个是不分词(在指定分词的字段上查询
,query的时候将输入的关键字用""包起来,这样就不会分词,而是用整词模式的,类似是sql语句里的like中间模糊匹配一样)。
e.对于触发场景必然发生的条件可以不用判断和容错,如果所有的语句都使用判断语句的话,不仅会出现大面积的if语句,也会影响性能。
f.在php里面变量可以直接使用,不需要声明;所以在用完一个大的变量后,最好可以手动unset销毁该变量(php的变量在方法体结束前都不会自动销毁)。这种情况在for,if块中比较常见(在if,for中定义的临时变量在该块外还可以应用也就是存在着占用内存块)。
2.保证程序的健壮性
a.涉及到dao查询,http连接,扩展服务器连接等场景的操作代码,最好都用try-catch监视起来。
b.涉及到一些应用变量空(未定义,null和空值)的场景。需要在它被应用的时候,尽量先判断非空(保证程序不会因为空的情况报错,例如拼接sql的时候)
c.合理设置默认值,在处理一些业务场景比较复杂的case的时候。可能因为没包含某些场景导致流程走错的情况,这时候可以设置默认值,走默认情况(当然这个是需要合理设置,也就是有些时候需要在出现新场景的情况不容进去而是让它报错,便于自己考虑新场景的流程)。