命名规范

方法

返回类型是Boolean类型的,方法名一般使用” is “ 或 “ has ”开头。示例:isConnected()

缩进

4个空格

空格的使用

注释隔一个空格

运算符用空格隔开

三目运算符 eg:return a == b ? 1 : 0;

逗号后空格

注释

块级别注释

eg
/*----------start: 订单处理 ------- */
  //取得dao
  OrderDao dao = Factory.getDao("OrderDao");
  /* 查询订单 */
  Order order = dao.findById(456);
  //更新订单
  order.setUserName("uu");
  order.setPassword("pass");
  order.setPrice("ddd");
  orderDao.save(order);
 /*----------end: 订单处理 ------- */

浮点算运算

涉及所有浮点数的运算,一律用BigDecimal运算来保证准确度。系统框架已提供封装后的方法。

Mysql命名规范

常规

库名、表名、字段名必须使用小写字母,“_”分割。

库名、表名、字段名必须不超过12个字符。

表必须使用“t_”开头命名。

存储精确浮点数必须使用DECIMAL替代FLOAT和DOUBLE。

整形定义中不添加长度,比如使用INT,而不是INT(4)。

VARCHAR(N),N表示的是字符数不是字节数,比如VARCHAR(255),可以最大可存储255个汉字,需要根据实际的宽度来选择N。

VARCHAR(N),N尽可能小,因为MySQL一个表中所有的VARCHAR字段最大长度是65535个字节,进行排序和创建临时表一类的内存操作时,会使用N的长度申请内存。

存储年使用YEAR类型。

存储日期使用DATE类型。

存储时间(精确到秒)建议使用TIMESTAMP类型,因为TIMESTAMP使用4字节,DATETIME使用8个字节。

建议字段定义为NOT NULL。

禁止在数据库中使用VARBINARY、BLOB存储图片、文件等。

表结构变更需要通知DBA审核。

索引

SQL语句中IN包含的值不应过多,不能超过1000个参数。

UPDATE、DELETE语句不使用LIMIT。

WHERE条件中必须使用合适的类型,避免MySQL进行隐式类型转化。

SELECT语句只获取需要的字段。

SELECT、INSERT语句必须显式的指明字段名称,不使用SELECT *,不使用INSERT INTO table()。

WHERE条件中的非等值条件(IN、BETWEEN、<、<=、>、>=)会导致后面的条件使用不了索引。

INSERT语句使用batch提交(INSERT INTO table VALUES(),(),()……),values的个数不应过多。

避免使用存储过程、触发器、函数等,容易将业务逻辑和DB耦合在一起,并且MySQL的存储过程、触发器、函数中存在一定的bug。

避免使用JOIN。

使用合理的SQL语句减少与数据库的交互次数。

禁止在数据库中使用VARBINARY、BLOB存储图片、文件等。

采用分布式文件系统更高效

QA

MySQL中如何进行分页?

假如有类似下面分页语句:

SELECT * FROM table ORDER BY TIME DESC LIMIT 10000,10;

这种分页方式会导致大量的io,因为MySQL使用的是提前读取策略。

推荐分页方式:

SELECT * FROM table WHERE TIME<last_TIME ORDER BY TIME DESC LIMIT 10

SELECT * FROM table inner JOIN(SELECT id FROM table ORDER BY TIME LIMIT 10000,10) as t USING(id)

为什么避免使用复杂的SQL?

拒绝使用复杂的SQL,将大的SQL拆分成多条简单SQL分步执行。原因:简单的SQL容易使用到MySQL的query cache;减少锁表时间特别是MyISAM;可以使用多核cpu。