一、后端USB
明令禁止选用递回;其原因:每天递回初始化时能向栈中push现阶段方式的运转状况(当晚),而Java栈缓存的选用少于管制的大半小时,流程会再次出现栈极度;
防止层次嵌套循环;
特别注意方式、类文档中的标识符量,适当分离;
选用基本上类型表述表达式时,一千万特别注意该表达式值可能为null的情形,这时提议选用相关联的包装袋Canillac表述表达式;
防止在同一个USB中过多地出访资料库,提议单次掌控在3次以上;
防止过多选用static表达式;其原因:动态表达式和类的开发周期并行;
尽可能选用lazy loading的思路,即在须要的这时候才已经开始建立表达式和第一类等;
将许多须要发生变动的实用性或美术内部结构设计写在特性文档中;
后端USB须要提供更多必要性的奇偶校验,千万别过分倚赖后端奇偶校验;
SQL句子极短时提议选用Provider堆叠,堆叠查阅Sql时加之” where 1 = 1 “;
倡导极度PCB,提升标识符时效性和可移植性等;
防止选用硬代码,多选用final表述常表达式,提升时效性;
2、SQL强化
尽可能选用单纯的SQL,防止多表查阅和在SQL中处置繁杂的方法论;
防止选用SQL句子次序,尽可能在流程中进行次序;
查阅时防止全表扫描器,适当减少检索;
内部结构设计表内部结构时:id、created、updated、version NOT NULL;id AUTO_INCREMENT
在查阅时千万别对所查阅列选用函数或者运算,否则检索无法选用到;
尽可能选用GROUP BY替换DISTINCT;
JOIN时选用小结果集驱动大结果集;
提议选用”临时表”暂存中间结果;
模糊查阅(LIKE)时防止在关键词前选用”%”(如:LIKE %小分期),否则查阅必然是全表扫描器;
对查阅进行强化,应尽可能防止全表扫描器,首先应考虑在where 及 order by涉及的列上建立检索。
应尽可能防止在 where 子句中选用!=或<>操作符、函数操作、表达式(如:num/2)和null值判断,否则将引擎放弃选用检索而进行全表扫描器。
应尽可能防止在 where 子句中选用 or 来连接条件,否则将导致引擎放弃选用检索而进行全表扫描器,如:
select id from t where num=10 or num=20
可以这样查阅:
select id from t where num=10
union all
select id from t where num=20
in 、 not in 、or 也要慎用,否则条件少于一定数量会导致检索失效(特别特别注意:严格明令禁止in后面选用子查阅),如:
select id from t where num in(1,2,3)
对于连续的数值,能用 between 就千万别用 in 了:
select id from t where num between 1 and 3
检索并不是越多越好,检索固然可以提升相应的 select 的效率,但同时也降低了 insert 及 update 的效率,因为 insert 或 update 时有可能会重建检索。一个表的检索数最好千万别少于6个。
任何地方都要慎重选用 select * from t取出所有列 ,千万别返回用不到的任何字段。
适当将繁杂查阅切分为若干个单表查阅或简易查阅。如将关联查阅分解为若干个单表查阅。
老老实实按照规范化写SQL,比如字符串一律该加引号就加引号。WHERE username = 1380000000和WHERE username = 1380000000是不同的。后者能正确选用检索,前者不能。
资料库表有version字段的,应当强制不为空。因为baseDao每天更新记录都会在这个字段加1,为空的话会再次出现极度。
where/group by/order by 的条件里,明令禁止给检索列套上函数,会让检索失效。例如:WHERE date(created) > 2021-01-01 这样的写法绝对明令禁止。
